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

// 类和动态内存分配

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变量必须这样初始化,其他变量也可以用列表初始化**
{
        ....
}

猜你喜欢

转载自blog.csdn.net/a185531353/article/details/78573370