同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为拷贝构造函数(Copy Constructor)。
int main(){ Test t1(10); Test t(t1); //调用拷贝构造函数 Test t2 = t1; //调动拷贝构造函数}1.调动拷贝构造函数的情况 (1)对象初始化对象调动拷贝构造函数
区别初始化与赋值
Test t(10);Test t1;t1 = t; //赋值Test t2(t);//初始化Test t3 = t;//初始化另外两种情况 (2)当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。这时要在内存新建立一个局部对象,并把实参拷贝到新的对象中。
void fun(Test t){}(3)当函数的返回值是类对象,函数执行完成返回调用者时使用。理由也是要建立一个临时对象中,再返回调用者。
Test fun(){ Test t; return t;}因为局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象的生存周期只在函数调用处的表达式中。所谓return 对象,实际上是调用拷贝构造函数把该对象的值拷入临时对象(对象初始化对象),最终返回的是临时对象。如果返回的是变量,处理过程类似,只是不调用构造函数。
这三种情况无疑都是对象初始化对象而已.
2.拷贝构造函数的参数–采用常引用
//拷贝构造函数的一般形式Test(const Test &t){ data = t.data;}(1)为什么采用引用传递参数 如果把一个真实的类对象作为参数传递到拷贝构造函数,此时,参数表里又是用对象初始化对象,调动拷贝构造函数。如此往复,造成无限递归。 如下图:
(2)为什么是常引用 常引用就使得被拷贝的类对象不能被随意修改,保证信息不被丢失。当然,你可以不用引用。
3.默认拷贝构造函数的功能 将对应的成员值进行拷贝
t1 tdata<---data新闻热点
疑难解答
图片精选