C++拷贝构造和赋值构造理解

C++一般创建对象 拷贝或者赋值的方式有:构造函数、拷贝构造函数、赋值函数。

1 构造函数
构造函数时一种特殊的成员函数, 是创建一个类的对象时,他被调用来对类的数据成员进行初始化和分配内存。

C++的空类,编译器会加入默认的成员函数:
默认构造函数和拷贝构造函数
析构函数
赋值函数(赋值运算符)
取值函数
即使程序没定义任何成员, 编译器也会插入以上函数
--->构造函数可以重载, 可以多个 可以带参数。 析构函数只有一个

2 拷贝构造函数
拷贝构造函数是C++独有的, 他是一种特殊的构造函数, 用基于同一个类的一个对象构造和初始化另一个对象。当没有重载构造函数时,通过默认构造函数来创建一个对象
A a;
(1) A b(a); (2) A b = a;
--->这里b对象不存在 是通过a对象拷贝构造和初始化b对象的

拷贝构造函数被调用场景:
A 一个对象以值传递的方式传入函数体
B 一个对象以值方式从函数返回
C 一个对象需要通过另外一个对象进行初始化

编译器会生成默认拷贝构造函数场景:
A 如果用户没有自定义拷贝构造函数 并且在代码中使用到了拷贝构造函数, 编译器会生成默认拷贝构造函数, 如果用户定义了拷贝构造函数,编译器则不生成
B 如果用户定义了一个构造函数 但不是拷贝构造函数,而又在代码中使用了拷贝构造函数 则编译器自动生成
--->系统提供的默认拷贝构造函数工作方式是内存拷贝 即浅拷贝, 如果对象中用到了需要手动释放的对象则会出现问题 这是需要手动重载拷贝构造函数即深拷贝
浅拷贝:如果复制的对象中引用了一个外部内容(例如分配到堆上的数据) 那么在复制这个对象时, 让新旧两个对象指向同一个外部内容就是浅拷贝(指针复制了, 指向控件内容并没有赋值)
深拷贝:如果在复制这个对象的时候为新对象做了外部对象的独立赋值 就是深拷贝

3 赋值函数
当一个类的对象向该类的另一个对象赋值时,就会用到该类的赋值函数。当没有重载赋值函数(赋值运算符)时, 通过默认赋值函数来进行赋值操作
A a, A b;
b = a;
--->这里a, b对象已经存在 是用a对象来赋值给b对象的

赋值函数的重载声明方式为: A& operation=(const A& other)

拷贝构造函数和赋值函数区别:
1>拷贝构造函数 是一个对象初始化一块内存区域, 这块内存区域就是新对象的内存区域; 赋值函数 是对于一个已经存在被初始化的对象进行赋值操作
2>一般来说在数据成员包含指针对象的时候, 需要考虑两种不同的处理需求:一种是复制指针对象, 另外一种是应用对象指针。 拷贝构造函数大多数情况下是复制, 复制函数则是引用
--->如果你想写拷贝构造函数和赋值函数, 又不允许别人使用编译器生成的缺省函数,最简单的办法是将拷贝构造函数和赋值函数声明为私有函数,不用编写代码.如下所示: 

class A
{
private:
    A(const A& a); //私有拷贝构造函数
    A& operate=(const A& a); //< 私有赋值函数
}

总结:
对象不存在,并且没有用别的对象来初始化 就是调用的构造函数
对象不存在,并且使用别的对象来初始化,就是拷贝构造函数
对象存在,用别的对象给他赋值,就是赋值函数


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值