【C++11】移动赋值 | 新的类功能 | 可变参数模板

这篇具有很好参考价值的文章主要介绍了【C++11】移动赋值 | 新的类功能 | 可变参数模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 移动赋值

【C++11】移动赋值 | 新的类功能 | 可变参数模板

C++11中,string中的operator= 包含 参数为右值的版本

【C++11】移动赋值 | 新的类功能 | 可变参数模板

C++98中 没有移动赋值和移动构造 ,只有参数为左值 的赋值重载(operator=)和拷贝构造

【C++11】移动赋值 | 新的类功能 | 可变参数模板
【C++11】移动赋值 | 新的类功能 | 可变参数模板

本来只有两次深拷贝,但是由于调用拷贝赋值时,内部又进行一次拷贝构造,所以导致最终进行三次深拷贝
这里编译器是不能优化的,因为优化的前提是 连续的构造或者拷贝构造


【C++11】移动赋值 | 新的类功能 | 可变参数模板

正常来说,str作为局部变量,应该作为左值,但编译器会对其优化,通过使用move函数,其函数返回值为右值,所以会先发生移动构造
临时对象 本身就是看不见 摸不到的,所以取不到地址,它也是右值
所以又会发生 移动赋值


【C++11】移动赋值 | 新的类功能 | 可变参数模板

移动赋值,实际上也是进行资源的转移


【C++11】移动赋值 | 新的类功能 | 可变参数模板

如:将临时对象所指向的数据 转移到s1 中,同时可将废弃数据放入临时对象(将亡值)中

2. 新的类的功能

C++11中新增 了 移动构造函数和 移动赋值运算符重载

移动构造

若没有实现移动构造,并且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意一个
(若实现了其中任意一个,则说明是深拷贝的类,如何转移应该自己说了算)
编译器就会自动生成一个默认移动构造


默认生成的移动构造,
对于内置类型成员,会执行浅拷贝(按字节拷贝)
对于自定义类型成员,则看这个成员是否实现移动构造,
若实现了就调用移动构造,若没有实现就调用拷贝构造


【C++11】移动赋值 | 新的类功能 | 可变参数模板

person类中,既没有实现移动构造 ,也没有实现析构函数、拷贝构造、拷贝赋值重载
所以该类会自动生成一个默认的移动构造

对于内置类型成员 _age,拷贝构造与 移动构造 都是完成浅拷贝


【C++11】移动赋值 | 新的类功能 | 可变参数模板

对于自定义类型成员 _name,因为在yzq命名空间的string类中存在 移动构造,所以调用 其移动构造


【C++11】移动赋值 | 新的类功能 | 可变参数模板

刚调试执行到s1时,s3实际上空间为空
当调试执行到s3时,对于内置类型成员_age 进行浅拷贝 ,所以s3._age 也被置为19
对于 自定义类型 成员 _name,因为string类中存在 移动构造,所以调用移动构造(资源转移)
所以 s1._name 空间被置空,s3._name 指向原s1._name的空间的地址


移动赋值

移动赋值与上述的移动构造类似

若没有实现移动赋值,并且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意一个
(若实现了其中任意一个,则说明是深拷贝的类,如何转移应该自己说了算)
编译器就会自动生成一个默认移动赋值

默认生成的移动赋值,
对于内置类型成员,会执行浅拷贝(按字节拷贝)
对于自定义类型成员,则看这个成员是否实现移动赋值,
若实现了就调用移动赋值,若没有实现就调用拷贝赋值

【C++11】移动赋值 | 新的类功能 | 可变参数模板

刚开始时,s4实际上空间为空
调试到移动赋值时,对于内置类型成员_age 进行浅拷贝 ,所以s4._age 也被置为19
对于 自定义类型 成员 _name,因为string类中存在 移动赋值,所以调用移动赋值(资源转移)
所以 s1._name 空间被置空,s4._name 指向原s1._name的空间的地址


default

强制生成默认函数的关键字 -default

【C++11】移动赋值 | 新的类功能 | 可变参数模板

由于显示写析构,使其无法生成默认的移动赋值,影响自定义类型成员 _name 移动赋值变成深拷贝


【C++11】移动赋值 | 新的类功能 | 可变参数模板

通过 default 强制生成默认移动赋值,即使有显示的析构函数存在,也不影响 自定义类型成员 _name 的移动赋值


delete

禁止生成默认函数的关键字 delete

【C++11】移动赋值 | 新的类功能 | 可变参数模板

istream在C++11中,不期望被拷贝,(拷贝会涉及缓冲区等问题)


【C++11】移动赋值 | 新的类功能 | 可变参数模板

默认成员函数,如果不写会默认生成,加入delete后可禁止生成

3.可变参数模板

可变参数模板 :可以接受可变参数的函数模板和类模板

【C++11】移动赋值 | 新的类功能 | 可变参数模板

声明一个参数包Args…args,这个参数包中包含0到任意个模板参数


【C++11】移动赋值 | 新的类功能 | 可变参数模板

参数是不限制类型和个数的


可变参数包的解析

通过增加一个模板参数,让编译器去解析参数包的东西
应用递归推导思维


【C++11】移动赋值 | 新的类功能 | 可变参数模板

主函数中的test是无参的,所以调用无参的test函数


【C++11】移动赋值 | 新的类功能 | 可变参数模板

当有一个参数a是,将a传给test作为第一个参数val,而test的第二个参数作为参数包就没有了
(参数包可以包含0个参数)
在带有形参的test函数中调用无参的test函数,进行换行


【C++11】移动赋值 | 新的类功能 | 可变参数模板

当有两个参数a和b时,将a传给test作为第一个参数val,将b传给test作为第二个参数 参数包
当test函数内部再次调用 test时,由于 参数包中的参数不为0,所以再次调用 带参的test

将b传给新的test作为第一个参数val , 新的test的第二个参数 参数包为0
当test函数内部再次调用 test时,由于参数包参数为0,所以去调用 无参的test ,进行换行
文章来源地址https://www.toymoban.com/news/detail-480062.html

到了这里,关于【C++11】移动赋值 | 新的类功能 | 可变参数模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++杂货铺】C++11新特性——可变参数模板

    C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模板和函数模板中只能含固定数量的模板参数,可变模板参数无疑是一个巨大的改进。然而由于可变模板参数比较抽象,使用起来需要一定的技巧,所以之一块还是比较晦涩的。本

    2024年02月03日
    浏览(29)
  • 【C++进阶】C++11(下)可变参数模板&lambda表达式&包装器

    我们紧接着上一节的讲解来进行 C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧

    2024年04月11日
    浏览(69)
  • C++11可变参数模板(typename... Args模板参数包或class... Args)(Args... args函数参数包)(递归展开与参数包展开(只支持C++17))

    C++可变参数是指函数的参数个数是可变的,可以在函数定义时不确定参数的个数,需要在函数体内通过特定的语法来处理这些参数。C++11标准引入了新的可变参数模板,使得可变参数的处理更加方便和灵活。在函数定义时,可以使用省略号(…)来表示可变参数,然后通过va_li

    2024年02月08日
    浏览(34)
  • 【C++】C++11新特性重点:可变参数+lambda

    C++11新特性第二篇重点 文章目录 上一篇的补充 一、可变参数模板 二、lambda函数 总结 上一篇我们重点讲解了右值引用+移动语义,关于移动构造和移动赋值还有一些需要补充的知识: 如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任

    2024年02月09日
    浏览(38)
  • 【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式

    在C++11之前,我们只有引用的概念,没有接触到所谓的左值引用或者是右值引用这种概念,从C++11开始,增加了右值引用的概念,那么现在我们将对引用进行一个概念上的区分。在此之前我们所说的引用都是左值引用,对于左值引用相关的内容,可以去看一看博主之前写的文章

    2024年02月15日
    浏览(46)
  • 从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值

    目录 1. 列表初始化initializer_list 2. 前面提到的一些知识点 2.1 小语法 2.2 STL中的一些变化 3. 右值和右值引用 3.1 右值和右值引用概念 3.2 右值引用类型的左值属性 3.3 左值引用与右值引用比较 3.4 右值引用的使用场景 3.4.1 左值引用的功能和短板 3.4.2 移动构造 3.4.3 移动赋值

    2024年02月12日
    浏览(26)
  • 模板学堂|SQL数据集动态参数使用场景及功能详解

    DataEase开源数据可视化分析平台于2022年6月正式发布模板市场(https://dataease.io/templates/)。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板,方便用户根据自身的业务需求和使用场景选择对应的仪表板模板,并在优质模板的基础上轻松制作自己的仪表板。

    2024年02月13日
    浏览(30)
  • AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 轻松文生视频

    在过年期间,OpenAI放出了SORA文生视频的预览效果,一瞬间各大媒体争相报道,又引爆了一次科技圈,可惜的是,SORA依然没选择开源。 在这个契机下,本来我也对文生视频的工作非常感兴趣,所以也研究了一些与SORA相关的技术,虽然我们没有像OpenAI那么大的算力,但做一些基

    2024年04月17日
    浏览(29)
  • c++中的类模板

    C++的类模板为生成通用的类声明提供了一种更好的方法。模板提供参数化类型,即能够将类型名作为参数传递给接收方来建立类或者函数。 不能将模板成员函数放在独立的实现文件中(以前,C++提供了export,让您能够将模板成员函数放在独立的实现文件中,但是支持的

    2024年02月14日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包