拷贝构造函数:是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。
赋值函数:是一种实现对象与对象之间相互赋值的过程。
其实两种函数说白了就是让一个对象变成另外一个对象的copy。不过这两种函数在被调用的时机上还是有差别的,如下面代码:
Object A;
Object B=A; //此时调用的是拷贝构造函数
A=B; //此时调用的是赋值构造函数
(一)拷贝构造函数
那么接下来先说下拷贝构造函数被调用的情形:
1) 一个对象作为函数参数,以值传递的方式传入函数:fun(A);2) 一个对象作为函数返回值,以值传递的方式从函数返回:return A;3) 一个对象用于给另外一个对象进行初始化(常称为赋值初始化):Object B=A;其实说白了,就是当需要将object1变成object2的一个copy,并且此时object1在内存中并不存在的时候就要调用拷贝构造函数。在编写拷贝构造函数的时候要注意一个问题就是:拷贝构造函数必须以引用的形式传递(参数为引用值)即:Object(Object& O);将参数声明为引用是为了防止 当 Object B=A时拷贝构造函数会递归的调用自己。(二)赋值函数
赋值函数就是普通的赋值操作,形如:
Object A,B;
A=B;
其实本质上是调用的 operate=(const& Object T);这个函数。
(三)深浅拷贝问题
说完了拷贝构造函数和赋值函数,那么接下来就轮到深浅拷贝问题出厂了,对于这两个函数,当我们编写一个新的C++类时,如果我们在新的类中没有自己编写拷贝构造函数和赋值函数,那么编译器为默认的为我们编写的新类加入默认的拷贝构造函数和赋值函数。C++提供的默认拷贝构造函数和赋值函数在进行对象Copy过程中,它的工作的方法是:完成一个成员一个成员的拷贝,如果成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。在默认拷贝构造函数中,拷贝的策略是逐个成员依次拷贝,但是,一个类可能会拥有资源,如果拷贝构造函数因此,当你编写的类中,存在类中成员变量为指针类型,同时该成员变量将要指向计算机中的某个资源的时候,为了防止,两个指针指向同一块资源,不知道何时才能正确的对资源进行释放的时候,就要对该类的拷贝构造函数和赋值构造函数进行重写。
简单地制作了一个该资源的拷贝,而不对它本身分配,就得面临一个麻烦的局面:两个对象都拥有同一个资源
。当对象析构时,该资源将经历两次资源返还。当对一个已经释放了的资源进行二次释放的时候,就会出现内存泄露问题。