当前位置: 首页 > news >正文

C++11----新引入的默认成员函数

之前学习了C++的六个默认成员函数:构造函数,析构函数,拷贝构造函数,拷贝赋值重载,取地址重载,const 取地址重载。由于C++11引入了右值引用以及万能引用,所以为了更好地适应新的东西,又引入了移动构造函数和移动赋值运算符重载。

这两个函数与之前的不一样,如果我们不写,编译器也不一定会自动生成,接下来让我们看看这两个函数在什么情况下才会自己生成,又做了些什么。

如果没有实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任

意一个。那么编译器会自动生成一个默认移动构造。因为这表示类不需要特殊的资源管理(如动态内存或文件句柄),默认的成员逐个移动是安全的;一旦类自己管理资源(定义了析构或拷贝相关函数),编译器就不会生成默认移动构造,以防止出现浅拷贝导致的资源重复释放或悬空指针问题。

其实也容易理解,我们在什么情况下才需要自己实现析构函数、拷贝构造、拷贝赋值重载呢?默认的析构函数会调用自定义成员变量的析构函数、基类的析构函数(如果有),但是不会主动释放指针资源;默认的拷贝构造,会按字节拷贝所给对象的内置成员变量,调用自定义类型成员变量的拷贝构造,仅拷贝指针值,不分配新内存;默认的赋值重载与默认的拷贝构造所做的事情差不多,逐成员赋值,调用自定义类型成员的赋值运算符,仅复制指针值

显而易见,需要做指针资源管理的才需要自己手写这三个函数,而且往往一起出现缺一不可,而其他的情况下用默认生成的就足够了。

那么默认的移动构造和移动赋值做了什么呢?

对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造, 如果实现了就调用移动构造,没有实现就调用拷贝构造。(移动赋值:对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋 值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。)

验证一下:只写了构造函数,可以使用移动构造函数。

如果我不给string写移动构造:可以看出来确实是调用了string的拷贝构造

如果写了析构函数呢?只能调用Person的默认拷贝构造了。

但是可以使用default关键字使其强制生成:

又比如说,虽然编译器可以生成默认移动构造,但是我就不让他生成:这里为什么会报错呢,我们知道当表达式是右值时,编译器优先选择移动构造,其次拷贝构造函数;如果移动构造函数被 delete,编译器不会退回到拷贝构造函数

我们可以自己写一下移动构造和移动赋值:

调用链条:

http://www.dtcms.com/a/512518.html

相关文章:

  • 广州商城型网站建设佛山网站建设有哪些
  • 寻找建设网站客户wordpress 是php
  • 理解 Linux 进程间通信(IPC)
  • JaveWeb后端-Web基础-SpringBoot Web、HTTP协议
  • Spring 自动注入是怎么实现的?从 @Component 到 @Autowired 的完整流程
  • 基于springboot的基于智能推荐的卫生健康系统开发与设计
  • 技术面:Spring(循环依赖,spring与springboot的区别)
  • 网站建设相关法律python破解wordpress
  • 高并发系统网络优化:TCP 参数调优、HTTP 协议优化(HTTP_2、HTTPS)
  • PostgreSQL跨数据库授权查询
  • 构建自定义命令行工具 - 打造专属指令体
  • 今日反弹有玄机:外围利好是助力!
  • 门户网站定制青岛网站建设公司招聘
  • 腾讯云做网站怎么样长沙装修公司口碑比较好的
  • 做翻译 网站php网站建设找哪家好
  • 网站建设中栏目是什么南京做代账会计在哪个网站上找
  • 2025年HR 数字化转型:从工具应用到组织能力重构的深度变革
  • 做网站需要看的书公司网站建设工作内容
  • 4.7.Cypher 中的子查询
  • 公共服务平台网站建设方案下载wordpress建站程序
  • 数据结构八大排序:希尔排序-原理解析+C语言实现+优化+面试题
  • 数据结构八大排序:归并排序-原理+C语言实现+优化+面试题
  • 无站点推广就是不在网上推广广州网站建设 美词
  • 佛山网站建设邓先生阳江市网络问政平台登录
  • 图像增广——弹性形变
  • 视频推拉流平台EasyDSS技术特点解析及多元应用场景剖析
  • 做网站需要学php吗北京公司注册代理
  • 职高门户网站建设标准wordpress火车头发布模板
  • CycleGAN实现MNIST与SVHN风格迁移
  • AVL树手撕,超详细图文详解