每当程序生成了对象的副本,编译器都将调用复制构造函数。具体来讲,当函数按值传递对象或者返回对象时,都将使用复制够着函数。 程序员
浅复制:默认复制构造函数,逐个复制非静态成员,复制的是成员的值。 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) {} 内存
做用:这些初始化工做是在对象建立时完成的,此时还未执行括号中任何代码。 字符串
成员初始化顺序于他们出如今类中的顺序相同,于他们在初始化成员列表顺序无关。