编译器默认为一个类生成的默认函数

  • 默认构造函数
  • 默认析构函数
  • 默认拷贝构造函数
  • 默认赋值函数
  • 移动构造函数
  • 移动拷贝函数

例如:

class DataOnly {
public:DataOnly ()                  // default constructor~DataOnly ()                 // destructorDataOnly (const DataOnly & rhs)              // copy constructorDataOnly & operator=(const DataOnly & rhs)    // copy assignment operatorDataOnly (const DataOnly && rhs)         // C++11, move constructorDataOnly & operator=(DataOnly && rhs)    // C++11, move assignment operator
};

=delete

1. 禁止使用编译器默认生成的函数

假如上面的几个函数中,不想使用其中某个,可以将其定义为private,或者使用=delete

#include <iostream>
using namespace std;class DataOnly {
public:DataOnly () {}~DataOnly () {}DataOnly (const DataOnly & rhs) = delete; //禁止使用该函数DataOnly & operator=(const DataOnly & rhs) = delete; //禁止使用该函数DataOnly (const DataOnly && rhs) {}DataOnly & operator=(DataOnly && rhs) {}
};int main(int argc, char *argv[]) {DataOnly data1;DataOnly data2(data1); // error: call to deleted constructor of 'DataOnly'DataOnly data3 = data1; // error: call to deleted constructor of 'DataOnly'return 0;
}

2. delete 关键字可用于任何函数,不仅仅局限于类的成员函数

#include <iostream>
using namespace std;class DataOnly {
public:void fun(int a) {}void fun(float a) = delete;
};int main(int argc, char *argv[]) {DataOnly data1;data1.fun(1); // OKdata1.fun(0.5); // error: call to member function 'fun' is ambiguousreturn 0;
}

3. 模板特化:在模板特例化中,可以用delete来过滤一些特定的形参类型

例如:Widget 类中声明了一个模板函数,当进行模板特化时,要求禁止参数为 void* 的函数调用。

  • 按照私有不实现思路,应该是将特例化的函数声明为私有型,如下:
#include <iostream>
using namespace std;class Widget {
public:template<typename T>void ProcessPointer(T* ptr) { cout << typeid (T).name() << endl;}
private:        void ProcessPointer(void*) { cout << "void" << endl;}
};int main(int argc, char *argv[]) {Widget w;int* ip = NULL;w.ProcessPointer(ip);void* vp = NULL;w.ProcessPointer(vp); //error: 'ProcessPointer' is a private member of 'Widget' w.ProcessPointer(vp);return 0;
}
  • =delete直接添加在后面就可以解决这个问题

= defaule

在程序员重载了自己上面提到的C++编译器默认生成的函数之后,C++编译器将不在生成这些函数的默认形式。

但是C++允许我们使用=default来要求编译器生成一个默认函数,如:

struct Point {Point()=default;Point(int _x, int _y) : x(_x), y(_y) {}int x = 0;int y = 0;
}

这样相当于无参的构造函数也是可以使用的。

C++中 =defaule 和 =delete什么意思相关推荐

  1. C++中 =defaule 和 =delete 使用

    编译器默认为一个类生成的默认函数 默认构造函数 默认析构函数 默认拷贝构造函数 默认赋值函数 移动构造函数 移动拷贝函数 class DataOnly { public:DataOnly () // ...

  2. SQL server触发器中 update insert delete 分别给写个例子被。

    SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...

  3. oracle中drop、delete和truncate的区别

    oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...

  4. Mysql中删除语句delete、truncate、drop的区别

    Mysql中删除语句delete.truncate.drop的区别 1.DROP: 用法: DROP TABLE 表名 DDL语句,删除数据和表结构,释放空间资源.注意:操作不放到rollback s ...

  5. C/C++基础进阶篇:C++11 中引入的 delete 描述符使用场景

    C++11 中引入的 delete 描述符主要有如下两个使用场景: 禁止编译器自动生成拷贝 Effective C++中提到 通过"私有化 + 只声明.不定义" 的方法禁止编译器生 ...

  6. Oracle中TRUNCATE、DELETE和DROP的区别?

    Oracle中TRUNCATE.DELETE和DROP的区别? 区别: 1.删除表时表数据方面 delete是每次从表中删除一行,同时将删除操作作为事务写进日志以便回滚操作,在有该操作的触发器时,执行 ...

  7. js之删除对象中的属性——delete、es6解构赋值、自执行匿名函数

    js之删除对象中的属性--delete.es6解构赋值.自执行匿名函数 实例 const person = {name: '李世民',gender: 'male',age: 24 };// 删除目标对 ...

  8. 编程中new[]和delete[]应该如何使用?

    在平时资料中,我们常看到:new和delete,new[]和delete[]一定要配对使用!有时候不配对使用也不会出现问题.也许你也是只知其然,不知其所以然,然而我也有点懵了. 在平时资料中,我们常看 ...

  9. alter添加多个字段_Oracle中 create , alter , delete ,等关键字的使用

    Oracle中 create , alter ,drop, insert , delete , update 等关键字的相关使用; 关键字 : create , alter ,drop 主要是针对or ...

最新文章

  1. 【Swift】自定义控件无限轮播 + 无限图片轮播
  2. Spring实战之三:高级装配
  3. Android(六)——Android第一周学习
  4. Fiddler进行模拟Post提交json数据,总为null解决方式
  5. java版电子商务spring cloud分布式微服务b2b2c社交电商:服务容错保护(Hystrix断路器)...
  6. dd命令快速生成一个大文件
  7. Makefile 入门教程
  8. oracle ora 16047,令人误解的ORA-16047: DGID mismatch between destination setting and target database...
  9. 用金蝶kis记账王批量审核会计凭证的方法
  10. Linux安装winetim简单教程,[转载]wine安装最新版TIM
  11. OSPF开销值、协议优先级及计时器的修改
  12. 原理图学习(点读笔调试)
  13. 你是如何转行的?转行容易吗?
  14. 项目使用微信公众平台图片显示此图片来自微信公众平台 解决方法
  15. 不得不知 云计算入门必备的60条术语
  16. Adobe After Effects 2021 for Mac v18.4.1 视频合成及特效制作软件
  17. 【产品经理】大学生英语拓展
  18. python下对bin文件的处理
  19. 斜杠 反斜杠  双斜杠 双反斜杠
  20. 【企业数字化转型】数字化转型的本质(学习笔记)

热门文章

  1. 网口相机设置自动复位时间(心跳时间)
  2. vb 实现二维数组(矩阵)转置。_笃学不倦|数组的定义
  3. python写端口扫描器_使用Python编写简单的端口扫描器的实例分享
  4. 在Linux上编译LLVM/Clang 8.0.0等全部源代码
  5. 【12c新特性】12c中如何自动启动PDB Pluggable Database
  6. 【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼
  7. swift--添加新手引导页
  8. linux 安装python MySQLdb
  9. 分享一个java对xml,excel,jdbc.properties,读写文件,读写图片等实现(1)
  10. 理解 Delphi 的类(十) - 深入方法[28] - 递归函数实例: 搜索当前目录下的所有嵌套目录...