C++中 =defaule 和 =delete 使用
编译器默认为一个类生成的默认函数
- 默认构造函数
- 默认析构函数
- 默认拷贝构造函数
- 默认赋值函数
- 移动构造函数
- 移动拷贝函数
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;
}
- =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 使用相关推荐
- C++中 =defaule 和 =delete什么意思
编译器默认为一个类生成的默认函数 默认构造函数 默认析构函数 默认拷贝构造函数 默认赋值函数 移动构造函数 移动拷贝函数 例如: class DataOnly { public:DataOnly () ...
- SQL server触发器中 update insert delete 分别给写个例子被。
SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...
- oracle中drop、delete和truncate的区别
oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
- Mysql中删除语句delete、truncate、drop的区别
Mysql中删除语句delete.truncate.drop的区别 1.DROP: 用法: DROP TABLE 表名 DDL语句,删除数据和表结构,释放空间资源.注意:操作不放到rollback s ...
- C/C++基础进阶篇:C++11 中引入的 delete 描述符使用场景
C++11 中引入的 delete 描述符主要有如下两个使用场景: 禁止编译器自动生成拷贝 Effective C++中提到 通过"私有化 + 只声明.不定义" 的方法禁止编译器生 ...
- Oracle中TRUNCATE、DELETE和DROP的区别?
Oracle中TRUNCATE.DELETE和DROP的区别? 区别: 1.删除表时表数据方面 delete是每次从表中删除一行,同时将删除操作作为事务写进日志以便回滚操作,在有该操作的触发器时,执行 ...
- js之删除对象中的属性——delete、es6解构赋值、自执行匿名函数
js之删除对象中的属性--delete.es6解构赋值.自执行匿名函数 实例 const person = {name: '李世民',gender: 'male',age: 24 };// 删除目标对 ...
- 编程中new[]和delete[]应该如何使用?
在平时资料中,我们常看到:new和delete,new[]和delete[]一定要配对使用!有时候不配对使用也不会出现问题.也许你也是只知其然,不知其所以然,然而我也有点懵了. 在平时资料中,我们常看 ...
- alter添加多个字段_Oracle中 create , alter , delete ,等关键字的使用
Oracle中 create , alter ,drop, insert , delete , update 等关键字的相关使用; 关键字 : create , alter ,drop 主要是针对or ...
最新文章
- win7网络中能看到计算机但无法连接,win7局域网内可以看到对方计算机但无法连接怎么办...
- 【Android 逆向】ART 脱壳 ( dex2oat 脱壳 | aosp 中搜索 dex2oat 源码 | dex2oat.cc#main 主函数源码 )
- 强连通分量的分解(转博客园)
- dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程
- 使用Visual Studio OnlineSQL Server数据库源控制:Git
- 没有业务思维,数据分析只能是一堆废纸
- IDEA打包jar 跳过测试
- 驱动精灵w8ndows xp sp2,独家率先支持Win8 驱动精灵2011 SP2发布
- ENVI添加指北针/比例尺
- 解读Verizon 2018数据泄漏调查报告:窃取身份仍是黑客最有效的攻击手段
- 百度网盘登陆验证提示:无法访问此页面,或者二维码显示失败,弹窗显示:无法访问此页面,确保web地址。。。。
- Bash Shellshock(Bash远程代码执行)漏洞分析及利用思路
- ALS爱立思常见问题汇总
- 计算机域名怎么查看?如何查看电脑域名?
- 准备搞个google play账号玩玩
- ADAMS三维路面重构
- Activity Result API详解,是时候放弃startActivityForResult了
- Python3 源码安装
- HTML5基础知识(全面)
- replace()和re.s()用法
热门文章
- 程序员如何编写高大上且实用的技术文档--转
- Solidworks建模画一个盒子
- FL Studio 21中文版支持主题随心换,FL Studio 21Mac版新增对苹果M2/1家族芯片原生支持。
- ip.php是什么意思,有人频繁试探云主机的 ip_js. PHP 是什么操作?
- 软件缺陷报告与JIRA工具使用学习笔记
- geany怎么编写python_Geany怎么使用,Geany安装使用教程
- 介绍大家一个很好玩的网站。多人在线flash联机游戏。
- 【LeetCode】不含重复字符的最长子字符串
- 路由器和交换机用什么线连接?
- 2014.7.14 有用的网址