复制构造函数的定义
复制(拷贝)构造函数是一种特殊的构造函数,其形参为本类的对象引用。作用是用一个已存在的对象去初始化同类型的新对象。
#include<iostream> using namespace std; class zywscq { public: zywscq(int aa):a(aa){} zywscq(const zywscq &C):a(C.a){} void putval(); private: int a; }; void zywscq::putval() { cout<<a<<endl; } int main() { zywscq A(5); zywscq B=A; B.putval(); return 0; }
这段代码如果没有写复制构造函数也没有关系,因为系统默认的复制构造函数就是把每个值对应的复制过去。程序中没有声明,编译器就自动生成一个默认的复制构造函数。
如果不希望对象被默认的复制构造:
C++98做法:将复制构造函数声明为private,并且不提供函数的实现。
C++11做法:用“=delete”指示编译器不生成默认复制构造函数。
比如这样:zywscq(const zywscq& p) =delete; //指示编译器不生成默认复制构造函数
调用复制构造函数的三种情况:
1.定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
2.如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;
3.如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造。
深层复制与浅层复制(深拷贝与浅拷贝)
浅层复制:就是对象数据的一一复制。
深层复制:当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指对象进行复制。
//浅层复制 #include<iostream> using namespace std; class zywscq { public: zywscq(int aa) { a=aa; p=new int(100); } void putval(); ~zywscq() { if(p!=NULL) delete p; } private: int a; int *p; }; void zywscq::putval() { cout<<*p<<endl; } int main() { zywscq A(5); zywscq B=A; A.~zywscq(); B.putval(); return 0; }
这是浅层复制,两个类里的指针指向的是同一个内存地址,这样很不好,一个类A销毁后,另一个类B的p指针就成了野指针,输出了不可预料的结果。
//深层复制 #include<iostream> using namespace std; class zywscq { public: zywscq(int aa) { a=aa; p=new int(100); } zywscq(const zywscq &C) { a=C.a; p=new int; *p=*(C.p); } void putval(); ~zywscq() { if(p!=NULL) delete p; } private: int a; int *p; }; void zywscq::putval() { cout<<*p<<endl; } int main() { zywscq A(5); zywscq B=A; A.~zywscq(); B.putval(); return 0; }
这是深层复制,结果是100,符合预期。