【C++11】类的新功能

前言

上文我们学习了包装器:function和bind。function可以包装一切可调用对象,并用统一的调用方式调用不同的可调用对象。bind则可以控制函数参数个数【C++11】包装器:function与bind-CSDN博客

本文我们来学习C++11的类中新增的一些功能

默认的移动构造和移动赋值

在原来的C++类里面有六个默认成员函数(既不写会编译器也会自动生成):构造函数\析构函数\拷贝构造函数\赋值重载\取地址重载\const 取地址重载。前四个是我们重点学习的,后两个不用管直接用编译器默认生成的即可。

在C++11中新增了两个默认成员函数:移动构造和移动赋值。

如果我们没有实现移动构造,并且没有实现析构函数、拷贝构造函数、赋值重载,编译器才会生成默认移动构造函数。默认的移动构造函数,对内置类型会按字节拷贝数据或移动资源(分情况:对于基本类型则是按字节拷贝,对于类类型有资源申请的则是移动资源),对自定义类型,则是看有没有实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。

如果我们没有实现移动赋值,并且没有实现析构函数、拷贝构造函数、赋值重载,编译器才会生成默认移动赋值函数。默认的移动赋值函数,对内置类型会按字节拷贝数据或移动资源(分情况:对于基本类型则是按字节拷贝,对于类类型有资源申请的则是移动资源),对自定义类型,则是看有没有实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷贝构造。(和上述移动构造基本一样)

如果我们实现了移动构造和移动赋值,相应的编译器就不会生成移动构造和移动赋值了

defult和delete

C++11中,为了让我们更好的控制默认成员函数,提供defult关键字。其作用是当我们想使用某个默认成员函数时,因为某种原因没有生成相应的默认成员函数,我们可以使用defult关键字使其强制生成。例如:我们实现了构造函数,但是想使用默认移动构造,就可以使用defult强制生成。

如果我们想限制一些默认成员函数的生成,使用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)
	{}

	//强制生成移动构造
	Person(Person&& p) = default;

	//强制不生成拷贝构造
	//Person(const Person& p) = delete;
private:

	string _name;
	int _age;
};

STL中一些变化

C++11中更新了不少东西:

最重要的新容器:unordered_map和unordered_set。

最重要的新接口:右值引用和移动语义相关的push/insert/emplace系列和移动构造和移动赋值,还有initializer_list版本的构造。

相关推荐
一直C3 分钟前
Linux系统编程|信号进阶 + SystemV IPC(消息队列、共享内存)
linux·c语言·开发语言·算法·青少年编程·vim
小+不通文墨12 分钟前
使用vscode里的U8G2 库编写OLED菜单控制
经验分享·笔记·单片机·嵌入式硬件·学习
小王C语言17 分钟前
QT 基础:QT SDK 下载、配置、新建项目、项目代码解释
开发语言·qt
葡萄成熟时 !33 分钟前
泛型知识笔记
开发语言·笔记·python
北风toto44 分钟前
扩展操作码技术 · 详细笔记
运维·服务器·笔记·软件设计师
新时代牛马1 小时前
SPL-TPL 链式启动:spl.c 与CONFIG_TPL 三阶段加载
c语言·开发语言
布莱克6051 小时前
链表详解:定义、作用、应用场景及与数组的区别(C/C++ 实战)
c语言·开发语言·c++·链表
2601_966949651 小时前
实时行情中的成交量 Volume 到底是什么?包含盘中撤单量吗?从交易数据语义到 QuantDash 实战解析
开发语言·人工智能·python·量化·quantdash·量化数据源
Z5998178411 小时前
c#软件开发学习笔记--WPF(Canvas、数据绑定、MVVM模式、值转换器)
笔记·学习·c#
茯苓gao1 小时前
从零开发 EtherCAT 主站(六):SOEM 初始化流程详解,主站是如何发现所有从站的?
笔记·嵌入式硬件·学习·信息与通信