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

【C++】C++11的可变参数模板、emplace接口、类的新功能

在这里插入图片描述
各位大佬好,我是落羽!一个坚持学习进步的学生。
如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步!

也欢迎关注我的blog主页: 落羽的落羽

文章目录

  • 一、可变参数模板
  • 二、emplace系列接口
  • 三、新的类功能

一、可变参数模板

可变参数模板是C++11引入的一项重要特性,它允许模板接受任意数量和类型的参数。这一特性极大地增强了C++模板的灵活性和表达能力。可变数目的参数称为参数包,存在两种参数包:模板参数包、函数参数包。

template<class ...Args>
void Func(Args... args)
{}

我们可以使用sizeof...操作符去计算参数包中参数的个数。

举个栗子:

template<class ...Args>
void Print(Args&&... args)
{cout << sizeof...(args) << endl;
}

在这里插入图片描述

可变参数模板的原理跟模板类似,本质都是去实例化对应类型和个数的多个函数。

二、emplace系列接口

C++11以后STL容器新增了emplace系列的接口,均为可变参数模板,在功能上兼容push和insert系列,但还有新特点。
在这里插入图片描述
假设容器存储对象类型为T,emplace还支持直接插入构造T对象的参数,有些场景下这样的操作会更高效一些,可以直接在容器空间上构造T对象。而直接插入对象的操作,emplace系列和insert、push等几乎没有区别,所以emplace_back总体更加高效,推荐使用。

在这里插入图片描述

三、新的类功能

原来的C++类中,有六个默认成员函数:构造函数、析构函数、拷贝构造函数、拷贝赋值重载、取地址重载、const取地址重载。C++11新增了两个默认成员函数:移动构造函数、移动赋值运算符重载。上一篇文章我们已经讲过。

一个类中,如果你没有自己实现移动构造函数,且没有实现析构函数、拷贝构造函数、拷贝赋值重载中的任意一种。那么编译器会自动生成一个默认移动构造,它对于内置类型成员会执行逐成员按字节拷贝,对于自定义类型成员需要看这个成员是否实现了移动构造,如果实现了就调用它的移动构造,没有实现就调用拷贝构造。

一个类中,如果你没有自己实现移动赋值重载,且没有实现析构函数、拷贝构造函数、拷贝赋值重载中的任意一种。那么编译器会自动生成一个默认移动赋值,它对于内置类型成员会执行逐成员按字节拷贝,对于自定义类型成员需要看这个成员是否实现了移动赋值,如果实现了就调用它的移动赋值,没有实现就调用拷贝赋值。

除此之外,C++11中还增加了两个关键字:

  • 假设你要使用某个默认的函数,但是这个函数没有默认生成,比如我们提供了拷贝构造,就不会生成移动构造了。我们还想使用的话,就可以使用default关键字,显示指定该函数生成:
class Person
{
public:Person(const char* name = "", int age = 0): _name(name), _age(age){}Person(const Person& p):_name(p._name), _age(p._age){}// 使用default关键字,使类生成默认移动构造函数Person(Person&& p) = default;private:string _name;int _age;
};
  • 如果想要限制某些默认函数的生成,在C++11中,只需在该函数声明后加上=delete即可,该语法指示编译器不生成对应函数的默认版本,=delete修饰的函数称为删除函数。
class Person
{
public:Person(const char* name = "", int age = 0): _name(name), _age(age){}Person(const Person& p):_name(p._name), _age(p._age){}// 使用delete关键字,使类禁止生成默认的拷贝构造函数Person(const Person& p) = delete;private:string _name;int _age;
};

本篇完,感谢阅读。


文章转载自:

http://lyuGTi20.wbfLy.cn
http://LeJ4OOwf.wbfLy.cn
http://YpDZSHSz.wbfLy.cn
http://qqtw6JQW.wbfLy.cn
http://dkUFXCyD.wbfLy.cn
http://SmhM7ACO.wbfLy.cn
http://YNOzRu7n.wbfLy.cn
http://JD28Hvpc.wbfLy.cn
http://F3dJzPbh.wbfLy.cn
http://rY4ROPDm.wbfLy.cn
http://6ghL4zI3.wbfLy.cn
http://6q8Rzazz.wbfLy.cn
http://6NW218F2.wbfLy.cn
http://tJOXRqQg.wbfLy.cn
http://15QNAJQ7.wbfLy.cn
http://pZUxBFGQ.wbfLy.cn
http://FTBAk8Lj.wbfLy.cn
http://yUYzuIUw.wbfLy.cn
http://dztc53Zr.wbfLy.cn
http://EbUTmya7.wbfLy.cn
http://6NrztSz5.wbfLy.cn
http://XwFhvB6o.wbfLy.cn
http://KGyGNwvw.wbfLy.cn
http://wSN45EB5.wbfLy.cn
http://rYyHvWpl.wbfLy.cn
http://CF3YlESG.wbfLy.cn
http://KQNymmnZ.wbfLy.cn
http://kc4tQzgn.wbfLy.cn
http://WeMWynVa.wbfLy.cn
http://lkk33NLV.wbfLy.cn
http://www.dtcms.com/a/369833.html

相关文章:

  • [特殊字符] 从零到一:打造你的VSCode圈复杂度分析插件
  • JVM如何排查OOM
  • Miniconda安装与VSCode搭建远程Python、Jupyter开发环境
  • 智能客户服务支持智能体
  • Gutenberg块编辑器:WordPress 2025高效内容开发指南
  • JUC、JVM八股补充
  • windows找不到gpedit.msc(本地组策略编辑器)
  • 【洛谷】队列相关经典算法题详解:模板队列、机器翻译、海港
  • 激光频率梳 3D 轮廓测量 - 油路板的凹槽深度和平面度测量
  • 24.线程概念和控制(一)
  • Altium Designer(AD24)切换工作界面为浅灰色的方法
  • 让字符串变成回文串的最少插入次数-二维dp
  • 零基础入门深度学习:从理论到实战,GitHub+开源资源全指南(2025最新版)
  • 从文本到知识:使用LLM图转换器构建知识图谱的详细指南
  • 【开题答辩全过程】以 停车场管理系统的设计与实现为例,包含答辩的问题和答案
  • 带fat32文件系统的bin二进制文件制作教程
  • 【Redis】缓存的穿透、击穿和雪崩
  • C++经典的数据结构与算法之经典算法思想:分治法(Divide and Conquer)
  • PDF教程|如何把想要的网页保存下来?
  • DevOps实战(2) - 使用Arbess+GitPuk+Docker实现Java项目自动化部署
  • Git reset 回退版本
  • PostgreSQL与Greenplum数据库的编程语言连接
  • git在Linux中的使用
  • 全面剖析TENGJUN防水TYPE-C板上双排贴(L7.55/舌片外露1.1/双耳带螺孔):认证、防水与结构设计的三重突破
  • fastapi通过sqlmodel连接Mysql实现crud功能
  • 百度竞价推广:搜索竞价信息流推广代运营
  • Go基础(④指针)
  • 【开题答辩全过程】以 基于JSP的高校健康体育活动管理系统的设计与实现为例,包含答辩的问题和答案
  • 贪心算法应用:基因编辑靶点选择问题详解
  • webrtc弱网-LossBasedBandwidthEstimation类源码分析与算法原理