您的位置:首页 > 其它

第十二章 类和动态内存分配

2017-11-19 11:27 183 查看
// 类和动态内存分配

1. 实例原型声明

class StringBad
{
private:
char *str;
int len;
static int num_strings;
const int text;//对于const 数据成员,必须在执行带构造函数之前初始化。。也就是成员初始化列表
public:
StringBad(const char *s);
StringBad();
StringBad(const StringBad & st);//复制构造函数,类中如果使用了new,则必须定义复制构造函数
~StringBad();
StringBad & operator=(const StringBad & st);
friend std::ostream & operator<<(std::ostream & os,const StringBad & st);
};


2.//重载 = 号

StringBad & StringBad::operator=(const StringBad & st){
if(this == &st)
return *this;
delete [] str;
len = st.len;
str = new char[len+1];
strcpy(str,st.str);
return *this;
}


3.//构造函数

StringBad::StringBad(const char *s){
len = strlen(s);
str = new char[len+1];//必须 len+1;
strcpy(str,s);
num_strings++;
}


4.//实例://注:delete 只能释放 new

char *str = "woaini";
len = strlen(str);
char *str1 = new char[len+1];//1.必须加一。
strcpy(str1,str);   //2.必须给str1中赋值
delete [] str1; // 若上述1,2没有完成 会弹框报错


3.//复制构造函数函数原型定义

StringBad::StringBad(const StringBad & st){//复制构造函数,类中如果使用了new,则必须定义复制构造函数
num_strings++;                         //如果类中没用使用new,则可以不定义复制构造函数,编译器会自动生成
len = st.len;
str = new char[len+1];
strcpy(str,st.str);
}


4.//如果没有定义复制构造函数会 怎么样?

(1) StringBad str = "123";
StringBad str1 = str; **//当 str1 调用~StringBad()时会报错,由于delete**

(2)void callm(const StringBad str); //做函数形参时 会出错
void callm(const StringBad & str);//定义为引用 时,正常运行


5. //成员初始化列表

//若有这样的函数

注:text 是 const 数据成员

StringBad::StringBad(int qs){
text = qs;**//无效的的,由于text是const数据成员**
}
//应该改为
StringBad::StringBad(int qs):text(qs),len(0)**//const变量必须这样初始化,其他变量也可以用列表初始化**
{
....
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: