类和动态内存分配

C++自动提供以下函数

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

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

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

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

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

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

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

2. 复制构造函数之前对象没有分配内存,不需要delete

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

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. 必须用这个格式来初始化一个引用数据成员

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

你可能感兴趣的:(类和动态内存分配)