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


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

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

文章目录

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

一、可变参数模板

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

cpp 复制代码
template<class ...Args>
void Func(Args... args)
{}

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

举个栗子:

cpp 复制代码
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关键字,显示指定该函数生成:
cpp 复制代码
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修饰的函数称为删除函数。
cpp 复制代码
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;
};

本篇完,感谢阅读。

相关推荐
j7~3 小时前
【C++ 标准项目】发布订阅消息队列 (篇七):项目创建与基础工具模块搭建
开发语言·c++·log4j·uuid·protobuf·helper工具·消息定义类型和交换机类型定义
leisoo80973 小时前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源
喜欢打篮球的普通人3 小时前
MiniMind 学习笔记(二十二):数学 Cookbook——把概率空间、期望、似然一次讲明白
人工智能·笔记·学习
Lazionr3 小时前
unordered_map和unordered_set的使用
开发语言·c++·算法
进化中的刀盾兽4 小时前
从零实现 C++ Json-Rpc(九):从 TCP 字节流中拆出完整消息——MuduoBuffer 与 LVProtocol
c++·rpc
Xiu Yan4 小时前
Python 数据分析:数据分析步骤
开发语言·python·数据分析
黑妹天下第一乖4 小时前
小智改造实战解读-用kokoro-onnx替换云端 TTS 的完整记录
大数据·开发语言·人工智能·python·交互
郑州光合科技余经理4 小时前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
JWASX4 小时前
【agent 开发】agent 开发学习 - LangChain(3)
学习·langchain
HZY1618yzh4 小时前
下一代编程语言出炉
c++·算法