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

c++关键字 =delete和=default

在C++的类中,有四类特殊的成员函数① 默认构造函数;② 拷贝构造函数;③ 拷贝赋值函数(operator=);④ 析构函数;它们控制着类的实例的创建、初始化、拷贝以及销毁。

(1)默认构造函数:如果对构造函数进行了重载,则编译器不会隐式的生成一个默认的构造函数,此时如果调用了默认构造函数会在编译时报错,为了避免这种情况,一般会选择重写默认构造函数,且函数体为空。关键字 =default 优化了这种行为,用该关键字标记重写的默认拷贝构造函数,编译器会隐式生成一个版本,在代码更加简洁的同时,编译器隐式生成的版本的执行效率更高

class Mine 
{
public:// 重载构造函数,此时不会隐式生成默认构造函数 Mine(int num) {}// 可选择重写默认构造函数 Mine() {}// 关键字 =default 标记编译器隐式生成该类的默认构造函数,// 代码更简洁,且隐式生成的版本执行效率更高 Mine() = default;
};int main()
{// 调用默认构造函数 Mine ob; // 调用默认拷贝构造函数 Mine pOb(ob);  // 需要特别注意的是:因为tOb是在创建时被赋值的,// 所以此处的赋值操作符调用的是默认拷贝构造函数 Mine tOb = pOb;Mine sOb;// 在构造完成之后,赋值操作符执行的就是赋值运算了,// 所以此时调用的就是拷贝赋值函数 sOb = tOb;/** 离开作用域时自动调用默认的析构函数  */return 0;
}

(2)拷贝构造函数 和 拷贝赋值函数:不论有没有对它们进行重载,编译器始终会隐式生成默认版本,但有的时候不希望类实例进行拷贝构造或拷贝赋值,此时可以重写它们并将权限设置为private,但这样只是利用语法特性来碰巧实现效果,且对友元会带来困惑。可以使用关键字 =delete 标记不想被类实例调用的拷贝构造和拷贝赋值,相当于删除了它们

class Mine
{
public:// 保证重载了构造函数后,编译器会隐式生成一个默认版本 Mine() = default;Mine(Mine& ob) = delete;Mine& operator=(Mine& ob) = delete;
};int main()
{Mine ob// 编译错误,调用的拷贝构造函数已删除 Mine pOb(ob);// 编译错误,调用的拷贝构造函数已删除 Mine tOb = pOb;Mine sOb;// 编译错误,调用的拷贝赋值函数已删除 sOb = tOb;return 0;
}

(3)析构函数:一个类中有且仅有一个析构函数(所以=delete不能用于析构函数),它是一个无参无返回值不能被重载的特殊成员函数,由系统自动调用,析构函数如果被重写,则系统会调用重写的版本,否则调用隐式生成的默认版本:

class Mine
{
public:~Mine() {} // 显示定义,相当于重写,若没有,则调用编译器默认生成的版本 ~Mine(int) {} // 编译错误,析构函数不允许被重载 ~Mine() = delete; // 编译错误,类仅有一个析构函数,删除了析构怎么销毁对象 
};

http://www.lryc.cn/news/134968.html

相关文章:

  • idea 左下角的Git(Version Control)中显示Local Changes窗口
  • .net老项目中Jquery访问webservice
  • SpringBoot项目集成ElasticSearch服务
  • 2023年网络安全比赛--综合渗透测试(超详细)
  • 一次网络不通“争吵“引发的思考
  • 【使用Node.js搭建自己的HTTP服务器】
  • 回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)
  • ● 392.判断子序列 ● 115.不同的子序列
  • 4.SpringCloud 基本架构
  • springboot后端返回图片,vue前端接收并显示的解决方案
  • 算法|Day46 动态规划14
  • 宠物小程序开发攻略:五分钟教你打造宠物店小程序
  • open suse 15.5(任意版本) 使用阿里云的repo
  • 第一篇:编写 Hello World 程序
  • python 打印沁园春 雪 居中对齐 文本对齐
  • 在 IDEA 中使用 Git开发 图文教程
  • NodeJs导出PDF
  • 内核编译机制
  • 机器人TF坐标系变换与一些可视化工具的应用
  • c++ 友元 运算符重载详解
  • DataWhale 机器学习夏令营第三期
  • 回归预测 | MATLAB实现BES-LSSVM秃鹰搜索算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图)
  • python分析实战(4)--获取某音热榜
  • Java根据List集合中的一个字段对集合进行去重
  • (AtCoder Beginner Contest 315)
  • API 接口选择那个?RESTful、GraphQL、gRPC、WebSocket、Webhook
  • 「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg
  • 软考高级架构师下篇-12层次式架构设计理论与实践
  • 234. 回文链表
  • LInux之例行工作