// 类和动态内存分配
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变量必须这样初始化,其他变量也可以用列表初始化**
{
....
}