首页 > 编程 > C++ > 正文

C++初级主题--(5)拷贝构造函数

2019-11-11 07:51:15
字体:
来源:转载
供稿:网友

一.概念

同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为拷贝构造函数(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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选