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

【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关键字即可

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版本的构造。

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

相关文章:

  • Android——Serializable和Parcelable
  • C++ 如何计算两个gps 的距离
  • Vue3调度器错误解析,完美解决Unhandled error during execution of scheduler flush.
  • ElasticSearch入门
  • 若依后台管理系统-v3.8.8-登录模块--个人笔记
  • 043-代码味道-循环依赖
  • 健康养生:拥抱活力生活
  • 针对Linux挂载NAS供Minio使用及数据恢复的需求
  • GitHub Actions 自动化部署 Azure Container App 全流程指南
  • [随笔] 升级uniapp旧项目的vue、pinia、vite、dcloudio依赖包等
  • outlook for mac本地邮件存放在哪儿?
  • 【MySQL】聚合查询 和 分组查询
  • Untiy 之如何实现一个跟随VR头显的UI
  • SVMSPro平台获取HTTP-FLV规则
  • Linux0.11系统调用:预备知识
  • docker部署deepseek
  • DDI0487--A1.7
  • 在K8S迁移节点kubelet数据存储目录
  • 对比测评:为什么AI编程工具需要 Rules 能力?
  • 五种机器学习方法深度比较与案例实现(以手写数字识别为例)
  • C#里嵌入lua脚本的例子
  • Cliosoft安装
  • 精益数据分析(31/126):电商关键指标深度解析与实战策略
  • React Native 动态切换主题
  • 【3D 地图】无人机测绘制作 3D 地图流程 ( 无人机采集数据 | 地图原始数据处理原理 | 数据处理软件 | 无人机测绘完整解决方案 )
  • Linux批量管理:Ansible自动化运维指南
  • MySQL--数据引擎详解
  • centos安装部署配置kafka
  • HCIP【VLAN技术(详解)】
  • 从架构原理到落地实践:Apache SeaTunnel×Cloudberry数据集成全解读