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

  1. 默认构造函数
  2. 默认析构函数
  3. 默认拷贝构造函数
  4. 默认赋值函数
  5. 移动构造函数
  6. 移动拷贝函数
class DataOnly {
public:
DataOnly () // default constructor
~DataOnly () // destructor DataOnly (const DataOnly & rhs)     // copy constructor
DataOnly & operator=(const DataOnly & rhs) // copy assignment operator DataOnly (const DataOnly && rhs) // C++11, move constructor
DataOnly & 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 ;
}

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(); // OK
data1.fun(0.5); // error: call to member function 'fun' is ambiguous
return ;
}

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 ;
}
  1. =delete直接添加在后面就可以解决这个问题

= default

在程序员重载了自己上面提到的C++编译器默认生成的函数之后,C++编译器将不在生成这些函数的默认形式。 
但是C++允许我们使用=default来要求编译器生成一个默认函数,如

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

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

本文转自:https://blog.csdn.net/lmb1612977696/article/details/80035487

C++中 =default 和 =delete 使用的更多相关文章

  1. C++中 =default,=delete用法

    =default: 用于显式要求编译器提供合成版本的四大函数(构造.拷贝.析构.赋值) 例如: class A{ public: A() = default; A(const A& a) = ...

  2. C++ default 和delete的新用法

    C++中的默认函数与default和delete用法一. 类中的默认函数a.类中默认的成员函数1.默认构造函数2.默认析构函数3.拷贝构造函数4.拷贝赋值函数5.移动构造函数6.移动拷贝函数 b.类中 ...

  3. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  4. c++中new和delete的使用方法

    c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间 ...

  5. C++中的new/delete与operator new/operator delete

    new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用opera ...

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

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

  7. C++中的new/delete

    不同于C语言中的malloc/free是库函数,C++语言中的new/delete是运算符,而不是库函数. new/delete执行流程 我们经常会接触到的是new/delete operator(就 ...

  8. c++11 类默认函数的控制:"=default" 和 "=delete"函数

    c++11 类默认函数的控制:"=default" 和 "=delete"函数 #define _CRT_SECURE_NO_WARNINGS #include ...

  9. 数据库中drop、delete与truncate的区别

    数据库中drop.delete与truncate的区别 drop直接删掉表: truncate删除表中数据,再插入时自增长id又从1开始 :delete删除表中数据,可以加where字句. (1) D ...

随机推荐

  1. “不是不需要运维工程师,是人人皆是运维”|对话阿里云MVP蒋烁淼(上)

    摘要: 与湖畔大学首期学员.阿里云MVP.驻云创始人蒋烁淼面对面 [三位阿里云MVP(驻云CEO.首席架构师.大数据总监)<MVP时间>首次同台授课,“湖畔第一大脑” 蒋烁淼领头线上精讲, ...

  2. Mysql----linux下安装和使用

    一.安装 安装环境centOS,MySQL 使用yum安装mysql 1. 下载rpm [root@CoderMrD admin]# wget -i -c http://dev.mysql.com/g ...

  3. javascript简介 标签: javascript 2015-11-13 12:13 1712人阅读 评论(39)

    JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现 ...

  4. 前后端登录注册之node剖析与token的使用状态

    登录模块功能详解 1.用户名密码的格式验证 由前端完成,根据需求自行决定,不加叙述 2.点击提交按钮思路详解 前端将用户名 以及加密后的密码还有验证码输入的内容统一发给后端  由后端和数据库的数据进行 ...

  5. 4818 Largest Empty Circle on a Segment (几何+二分)

    ACM-ICPC Live Archive 挺水的一道题,直接二分圆的半径即可.1y~ 类似于以前半平面交求核的做法,假设半径已经知道,我们只需要求出线段周围哪些位置是不能放置圆心的即可.这样就转换为 ...

  6. oracle函数 TRANSLATE(c1,c2,c3)

    [功能]将字符表达式值中,指定字符替换为新字符 [说明]多字节符(汉字.全角符等),按1个字符计算 [参数] c1   希望被替换的字符或变量 c2   查询原始的字符集 c3   替换新的字符集,将 ...

  7. TensorFlow 中的卷积网络

    TensorFlow 中的卷积网络 是时候看一下 TensorFlow 中的卷积神经网络的例子了. 网络的结构跟经典的 CNNs 结构一样,是卷积层,最大池化层和全链接层的混合. 这里你看到的代码与你 ...

  8. DECLARE

    -- 修正用プログラム DECLARE    CURSOR c_adv_fee_detail IS        SELECT adv_fee.fee_mgmt_num,                ...

  9. H3C 常用设备管理命令

  10. Win7如何显示文件后缀

    有些时候,我们需要修改文件的后缀名,但是Windows7系统默认不显示文件后缀.我们怎样显示和修改文件后缀呢?请接着往下看. 工具/原料   一个win7系统 方法/步骤   1 如图所示,此时是无法 ...