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

  1. 默认构造函数
  2. 默认析构函数
  3. 默认拷贝构造函数
  4. 默认赋值函数
  5. 移动构造函数
  6. 移动拷贝函数
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* 的函数调用。
1. 按照私有不实现思路,应该是将特例化的函数声明为私有型,如下:

#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;
}
  1. =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. win7网络中能看到计算机但无法连接,win7局域网内可以看到对方计算机但无法连接怎么办...
  2. 【Android 逆向】ART 脱壳 ( dex2oat 脱壳 | aosp 中搜索 dex2oat 源码 | dex2oat.cc#main 主函数源码 )
  3. 强连通分量的分解(转博客园)
  4. dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程
  5. 使用Visual Studio OnlineSQL Server数据库源控制:Git
  6. 没有业务思维,数据分析只能是一堆废纸
  7. IDEA打包jar 跳过测试
  8. 驱动精灵w8ndows xp sp2,独家率先支持Win8 驱动精灵2011 SP2发布
  9. ENVI添加指北针/比例尺
  10. 解读Verizon 2018数据泄漏调查报告:窃取身份仍是黑客最有效的攻击手段
  11. 百度网盘登陆验证提示:无法访问此页面,或者二维码显示失败,弹窗显示:无法访问此页面,确保web地址。。。。
  12. Bash Shellshock(Bash远程代码执行)漏洞分析及利用思路
  13. ALS爱立思常见问题汇总
  14. 计算机域名怎么查看?如何查看电脑域名?
  15. 准备搞个google play账号玩玩
  16. ADAMS三维路面重构
  17. Activity Result API详解,是时候放弃startActivityForResult了
  18. Python3 源码安装
  19. HTML5基础知识(全面)
  20. replace()和re.s()用法

热门文章

  1. 程序员如何编写高大上且实用的技术文档--转
  2. Solidworks建模画一个盒子
  3. FL Studio 21中文版支持主题随心换,FL Studio 21Mac版新增对苹果M2/1家族芯片原生支持。
  4. ip.php是什么意思,有人频繁试探云主机的 ip_js. PHP 是什么操作?
  5. 软件缺陷报告与JIRA工具使用学习笔记
  6. geany怎么编写python_Geany怎么使用,Geany安装使用教程
  7. 介绍大家一个很好玩的网站。多人在线flash联机游戏。
  8. 【LeetCode】不含重复字符的最长子字符串
  9. 路由器和交换机用什么线连接?
  10. 2014.7.14 有用的网址