复制构造函数与合成复制构造函数 & 深复制与浅复制

一、复制构造函数

复制构造函数又称为拷贝构造函数,它是一种特殊的构造函数。它的作用就是用一个已经生成的对象来初始化另一个同类的对象

复制构造函数定义的一般形式为:

类名(const 类名& obj)

{

函数体

}

class Point { //Point类
public:
 Point() : x(0), y(0) { } //默认构造函数
 Point(const Point& r) : x(r.x), y(r.y) { } //复制构造函数
 Point(int a,int b) : x(a), y(b) { } //带参数的构造函数
private:
 int x,y;
};

复制构造函数有且只有一个本类类型对象的引用形参,通常使用 const限定。因为复制构造函数只是复制对象,没有必要改变传递来的对象的值。

与复制构造函数对应的对象的定义形式为:

类名 对象名1(类对象1), 对象名2(类对象2),……;

对象赋值和对象复制的区别:

►对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行赋值。

►对象的复制则是从无到有地建立一个新对象并使它与一个已有的对象完全相同(包括对象的结构和成员的值)。

二、合成复制构造函数

每个类必须有一个复制构造函数。如果类没有定义复制构造函数, 编译器就会自动合成一个,称为合成复制构造函数(synthesized copy constructor)。

►与合成默认构造函数不同,即使定义了其他构造函数,编译器也会合成复制构造函数。

►合成复制构造函数的操作是:执行逐个成员初始化,将新对象初始化为原对象的副本。

 以下3种情况会使用复制构造函数。

(1)用一个对象显式或隐式初始化另一个对象。

C++支持两种初始化形式:复制初始化和直接初始化。复制初始化使用等号(=),而直接初始化将初始化式放在圆括号中。 复制初始化和直接初始化是有区别的:直接初始化会调用与实参匹 配的构造函数;而复制初始化总是调用复制构造函数

 (2)函数参数按值传递对象时或函数返回对象时。

当函数形参为对象类型,而非指针和引用类型时,函数调用按值传递对象,即编译器调用复制构造函数产生一个实参对象副本传递到函数中。  类似地,以对象类型作为返回值时,编译器调用复制构造函数产生一个return语句中的值的副本返回到调用函数。

(3)根据元素初始化式列表初始化数组元素时。

如果没有为类类型数组提供元素初始化式,则将用默认构造函数初 始化每个元素。然而,如果使用常规的大括号的数组初值列表形式来初始化数组时,则使用复制初始化来初始化每个元素。

总的来说,正是有了复制构造函数,函数才可以传递对象和返回对象,对象数组才能用初值列表的形式初始化。

三、深复制与浅复制

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木(。・ω・。)ノ♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值