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* 的函数调用。
- 按照
私有不实现
思路,应该是将特例化的函数声明为私有型,如下:
#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 ...
最新文章
- 【Swift】自定义控件无限轮播 + 无限图片轮播
- Spring实战之三:高级装配
- Android(六)——Android第一周学习
- Fiddler进行模拟Post提交json数据,总为null解决方式
- java版电子商务spring cloud分布式微服务b2b2c社交电商:服务容错保护(Hystrix断路器)...
- dd命令快速生成一个大文件
- Makefile 入门教程
- oracle ora 16047,令人误解的ORA-16047: DGID mismatch between destination setting and target database...
- 用金蝶kis记账王批量审核会计凭证的方法
- Linux安装winetim简单教程,[转载]wine安装最新版TIM
- OSPF开销值、协议优先级及计时器的修改
- 原理图学习(点读笔调试)
- 你是如何转行的?转行容易吗?
- 项目使用微信公众平台图片显示此图片来自微信公众平台 解决方法
- 不得不知 云计算入门必备的60条术语
- Adobe After Effects 2021 for Mac v18.4.1 视频合成及特效制作软件
- 【产品经理】大学生英语拓展
- python下对bin文件的处理
- 斜杠 反斜杠 双斜杠 双反斜杠
- 【企业数字化转型】数字化转型的本质(学习笔记)
热门文章
- 网口相机设置自动复位时间(心跳时间)
- vb 实现二维数组(矩阵)转置。_笃学不倦|数组的定义
- python写端口扫描器_使用Python编写简单的端口扫描器的实例分享
- 在Linux上编译LLVM/Clang 8.0.0等全部源代码
- 【12c新特性】12c中如何自动启动PDB Pluggable Database
- 【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼
- swift--添加新手引导页
- linux 安装python MySQLdb
- 分享一个java对xml,excel,jdbc.properties,读写文件,读写图片等实现(1)
- 理解 Delphi 的类(十) - 深入方法[28] - 递归函数实例: 搜索当前目录下的所有嵌套目录...