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

来源:互联网 发布:电路设计仿真软件 航空 编辑:程序博客网 时间:2024/05/16 10:49

// 类和动态内存分配

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