构造函数、析构函数、拷贝函数与移动函数概述

在C++中,构造函数、析构函数、拷贝函数和移动函数是类对象管理生命周期的关键机制,它们决定了对象的创建、销毁及其在赋值或传递过程中的行为。

构造函数:用于初始化对象。当对象创建时,构造函数被调用,负责分配资源并设置初始状态。C++允许构造函数的重载,以处理不同的初始化方式。

析构函数:在对象生命周期结束时被调用,负责释放对象所占用的资源,如动态内存或文件句柄。析构函数的主要作用是确保资源的正确清理,避免资源泄漏。

拷贝构造函数与拷贝赋值运算符:当对象被拷贝(如通过传值或赋值操作)时,拷贝构造函数或拷贝赋值运算符会执行,负责将一个对象的状态完整复制到另一个对象中。默认情况下,C++会提供浅拷贝,但在某些情况下需要实现深拷贝以避免资源共享问题。

移动构造函数与移动赋值运算符:移动语义是C++11引入的优化机制。移动函数用于“移动”对象的资源,而非复制,通常用于临时对象或需要大数据转移的场景。移动构造和移动赋值操作不会复制资源,而是将资源的所有权转移到新的对象,从而提高性能并避免不必要的资源分配。

这些函数共同管理对象的生命周期、资源分配与转移,确保对象在复

构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。

注意点:调用构造函数的时候,
不论有没有初始化(例如:赋不同初值初始化: a(0),b(8.8),c(1)),
都要初始化赋初值(例如,默认都给0也要初始化:a(0),b(0),c(0)),
然后再到程序内部—(如果存在赋值,则赋值)。

在这里插入图片描述

构造函数的default和delete

C++11中,当类中含有不能默认初始化的成员变量时,可以禁止默认构造函数的生成,
myClass()=delete;//表示删除默认构造函数
myClass()=default;//表示默认存在构造函数
当类中含有不能默认拷贝成员变量时,可以禁止默认构造函数的生成,
myClass(const myClass&)=delete;//表示删除默认拷贝构造函数,即不能进行默认拷贝
myClass & operator=(const myClass&)=delete;//表示删除默认拷贝构造函数,即不能进行默认拷贝

调用拷贝构造函数的情形 (系统默认)

 1)用类的一个对象去初始化另一个对象的时候 (赋值=,{},={})
 2)当函数的参数是类的对象时,就是值传递的时候,如果是引用传递则不会调用
 3)当函数的返回值是类的对象或者引用的时候

拷贝构造函数包括深拷贝,浅拷贝

深拷贝和浅拷贝主要的区分在当数据成员中有指针时
当出现类的等号赋值时,会调用拷贝函数,在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的。
但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象。所以,这时,必须采用深拷贝。
深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。

//Code Source
int main(){
{ //// 花括号让s1和s2变成局部对象,方便测试
Student s1;
Student s2(s1); /// 复制对象
}
return 0;
}

在这里插入图片描述

拷贝构造、拷贝赋值函数

在这里插入图片描述
在这里插入图片描述

移动构造、移动赋值函数

见:基于右值引用可以实现转移语义和完美转发新特性。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值