类和动态内存分配

C++自动提供如下函数

  1.  默认构造函数
  2. 复制构造函数
  3. 赋值运算符
  4. 析构函数
  5. 地址运算符

复制构造函数和赋值运算符重载

每当程序生成了对象的副本,编译器都将调用复制构造函数。具体来讲,当函数按值传递对象或者返回对象时,都将使用复制够着函数。 程序员

浅复制:默认复制构造函数,逐个复制非静态成员,复制的是成员的值。 tcp

深复制:复制构造函数应当复制字符串并将副本的地址赋给str成员。不是仅仅复制字符串的地址。这样在调用析构函数时就不会出现释放已经释放的字符串。 函数

复制构造函数和赋值运算符重载的几个区别: this

1. 复制构造函数没有返回值,赋值运算符返回对象的一个引用。 spa

2. 复制构造函数以前对象没有分配内存,不须要delete 指针

3.复制构造函数会增长对象的个数 code

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

能够这样避免编译器生成默认的构造函数和赋值运算符重载函数 对象

class Queue
{
    private:
        Queue(const Queue &){}
        Queue &operator=(const Queue &){
           // return *this;
        }
}

c程序员一般使用NULL而不是0来表示一个指针为空;用'\0'来指明字符串的结束,而不是0

初始化成员列表

语法:classname::func(int n,int m):mem1(n),mem2(m) {} 内存

做用:这些初始化工做是在对象建立时完成的,此时还未执行括号中任何代码。 字符串

  1. 这种格式只能用于构造函数
  2. 必须用这个格式来初始化费静态const成员(const成员复值将编译不经过)
  3. 必须用这个格式来初始化一个引用数据成员

成员初始化顺序于他们出如今类中的顺序相同,于他们在初始化成员列表顺序无关。

相关文章
相关标签/搜索