= delete

delete的由来

如之前提到的,在没有声明默认特殊成员函数的时候,编译器会自动帮我们补充,但有时候我们并不希望存在这些函数,比如:我们不希望某个类通过拷贝的方式实例化一个新的对象。就算我们不定义拷贝构造函数和重载拷贝赋值运算符,编译器也会为我们自动完成。

#include <bits/stdc++.h>
using namespace std; class LiF {
public:
LiF() = default;
LiF(int _lif) {
lif = _lif;
}
void print(){cout << lif << endl;}
~LiF() = default;
private:
int lif;
}; int main() {
LiF* lif1 = new LiF{2};
LiF lif2 = *lif1; // 我们不希望这个类可以拷贝构造
lif2.print();
delete lif1;
lif1 = nullptr;
return 0;
}

写出如上代码之后,编译可以通过,但违反了我们的初衷。

再看下面这个场景:

double add(double x, double y) {
return x + y;
} int main() {
int a, b;
add(a, b);
return 0;
}

这里我们声明了double类型的add函数,编译可以通过。假设此时我们不希望其他类型能通过隐式转换调用这个函数,那这里就需要禁用掉会发生转换的版本。

由此C++11引入了delete关键字,用于显式禁用某些函数。

delete示例

default不同的是,delete没有限制函数必须是类的特殊成员函数。

#include <bits/stdc++.h>
using namespace std; class LiF {
public:
LiF() = default;
LiF(int _lif) {
lif = _lif;
}
LiF(const LiF& l) = delete; // 显式禁用拷贝构造函数
LiF& operator= (const LiF& l) = delete; // 显式禁用拷贝赋值运算符 void print(){cout << lif << endl;} ~LiF() = default;
private:
int lif;
}; int main() {
LiF* lif1 = new LiF{2};
LiF lif2 = *lif1; // 这里将引发报错,因为拷贝赋值运算符已被显式禁用
lif2.print();
delete lif1;
lif1 = nullptr;
return 0;
}
double add(double x, double y) {
return x + y;
}
int add(int, int) = delete; // 显式禁用add函数的int版本 int main() {
int a, b;
add(a, b); // 这里将引发报错,因为对应的函数已被显式禁用
return 0;
}

这里有一点需要注意的是,delete关键字仅仅禁用了函数的调用,但在编译过程中,名字查找和重载解析时,该函数名仍是一个有效的标识符。

分析第二个例子:我们声明并定义了double类型的add函数,声明并显式禁用了add函数的int重载。在编译到add(a, b)时,编译器进行名字查找,找到全局作用域的add函数定义,并通过精确匹配最终定位到int add(int, int)这个重载上,随后编译器发现这是一个deleted(已被禁用)函数,引发报错。

C++:= delete的更多相关文章

  1. 原生JS:delete、in、typeof、instanceof、void详解

    delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/doc ...

  2. 翻译:delete语句(已提交到MariaDB官方手册)

    本文为mariadb官方手册:DELETE语句的译文. 原文:https://mariadb.com/kb/en/delete/ 我提交到MariaDB官方手册的译文:https://mariadb. ...

  3. mysql清空表命令:delete和truncate区别

    mysql清空表可以用delete和truncate两个命令来完成: 1. delete ① 语法:delete from table_name: ② 示例:DELETE FROM `order`; ...

  4. MySQL学习笔记:delete from与truncate table的区别

    在Mysql数据库的使用过程中,删除表数据可以通过以下2种方式: delete from table_name truncate table table_name (1)delete from语句可以 ...

  5. MySQL学习笔记:delete

    使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 语法: DELETE FROM table_name [WHERE Clause] 如果没有指定 WHERE 子句, ...

  6. Sybase:delete与truncate、drop区别

    Sybase:delete与truncate.drop区别 区别: TRUNCATE TABLE TABLENAME:删除内容.释放空间但不删除定义. DELETE FROM TABLENAME:删除 ...

  7. javascript:delete 删除对象的属性

    delete 运算符删除对以前定义的对象属性或方法的引用. 不可以删除的如下: 1通过var定义的变量 var a=1;delete a//false 2 声明后的函数 function a(){}; ...

  8. 删除数据高级用法:delete,truncate

    1.语法: delete 允许使用条件(删除符合条件的数据) 允许使用limit,限制删除的记录数.limit N     常见的是,limit配合order by来使用:先将结果排序,再删除固定数量 ...

  9. 详解数据库三种删除方法: delete drop truncate

    Delete Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行). 删除某一行:Delete from 数据表名称 where 列名称=值: 删除所有行:Del ...

  10. 面试突击55:delete、drop、truncate有什么区别?

    在 MySQL 中,删除的方法总共有 3 种:delete.truncate.drop,而三者的用法和使用场景又完全不同,接下来我们具体来看. 1.delete detele 可用于删除表的部分或所有 ...

随机推荐

  1. qt 界面去掉系统边框2.0版

    之前的一版存在bug.如果将鼠标放移动到界面内某个可点击的widget上(如:QPushButton)上,按住鼠标左键不放,界面可能会出现界面非预期移动的问题. 那是因为当鼠标移动到可点击的widge ...

  2. JZOJ 2158. 蚂蚁

    这个是今天早上比赛的内容,比较水给大伙们讲一下(我只会这一个) 题目大意: n只蚂蚁以每秒1cm的速度在长为L  cm(厘米,不是lcm)的竿子上爬行.当蚂蚁爬到竿子的端点时就会掉落.由于竿子太细,两 ...

  3. 实验6:Mapreduce实例——WordCount

          实验目的1.准确理解Mapreduce的设计原理2.熟练掌握WordCount程序代码编写3.学会自己编写WordCount程序进行词频统计实验原理MapReduce采用的是“分而治之”的 ...

  4. Vue 拖拽组件 vuedraggable 和 vue-dragging

    一.描述 之前用 vue 写过一个在线的多二维码生成服务,体验地址:https://postbird.gitee.io/vue-online-qrcode/ 后面发现二维码多了之后有时候想要排序,需要 ...

  5. FCC-学习笔记 Convert HTML Entities

    FCC-学习笔记  Convert HTML Entities 1>最近在学习和练习FCC的题目.这个真的比较的好,推荐给大家. 2>中文版的地址:https://www.freecode ...

  6. Struts2 Action的3种创建方式

    Action是Strut2的核心内容,相当于Servlet,用于处理业务. Action是一个Java类,直接新建Java类即可. Action有3种实现方式. 1.使用POJO,设置成员变量,写对应 ...

  7. 7 CentOS 7网卡配置

    首先重中之重:修改前一定要进行系统备份,如果是虚拟机进行快照 查看虚拟机的网卡配置 注意桥接模式和NAT模式     桥接模式:网络层面,虚拟机和PC处于同级地位,虚拟机直接和路由器相连     NA ...

  8. element-ui的form表单样式改动

    造成下面样式错乱是下面自带的css样式,原本打算通过样式重写在组件内的style,发现下面相应的元素是出于封装情况的,无论样式重写在组件还是在公共样式均不能很好的解决,因为跳转到该页面时都要刷新一次, ...

  9. Centos7安装宝塔控制面板

    目录 宝塔面板安装和使用图文教程 1,通过ssh工具登录服务器 2,安装宝塔面板 2,登录宝塔面板 3,设置宝塔面板 3.1,首先我们进入面板设置 3.2,更改面板端口 3.3,绑定域名 3.4,绑定 ...

  10. [Python]使用生成器来简化代码

    原本只是大概知道生成器是什么,但一直不知道怎么用,或是什么情景下用,后来才发现: 在需要一边读数据一边处理任务时,如果直接为每个任务都写一个函数,那么读数据的部分就要在每个函数都重复一遍 直接将所有任 ...