2019独角兽企业重金招聘Python工程师标准>>>
一.首先,如果不对一个类定义其拷贝构造函数和操作符重载的话,c++会提供两个默认的函数。功能就是内存拷贝。在常见的应用中,这种机制就能够实现我们想要的拷贝了,但是当类包含动态分配内存的成员时,就会出现问题,这个时候,这种默认的拷贝构造和默认的“=”重载都只是实现浅层拷贝,以指针为例,它们只是拷贝指针的内容,而拷贝后,只是指向了同一块内存而已。这种时候,我们便需要重写拷贝构造函数和“=”重载。
二.解决了第一个问题之后,第二个问题是,什么情况下会调用拷贝构造函数,什么情况下又是调用的“=”重载呢?
特此做了一组实验。分情况讨论之。假定已经定义了类Test。
1.Test t1, t2(t1); 这种情况很显然,显式地调用了拷贝构造函数。
2.Test t1; Test t2; t2 = t1; 这种情况也不难判断,显式地调用了“=”重载。
3.Test t1; Test t2 = t1; 这种情况有些人会以为是赋值,所以理所当然的以为调用的是"="重载函数,其实是错误的,这种情况调用的其实是拷贝构造函数。我们需要明确这是在初始化,不是在赋值。
4.函数的参数和返回值。 这种情况调用的也是拷贝构造函数。