C++:= delete
= 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的更多相关文章
- 原生JS:delete、in、typeof、instanceof、void详解
delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/doc ...
- 翻译:delete语句(已提交到MariaDB官方手册)
本文为mariadb官方手册:DELETE语句的译文. 原文:https://mariadb.com/kb/en/delete/ 我提交到MariaDB官方手册的译文:https://mariadb. ...
- mysql清空表命令:delete和truncate区别
mysql清空表可以用delete和truncate两个命令来完成: 1. delete ① 语法:delete from table_name: ② 示例:DELETE FROM `order`; ...
- MySQL学习笔记:delete from与truncate table的区别
在Mysql数据库的使用过程中,删除表数据可以通过以下2种方式: delete from table_name truncate table table_name (1)delete from语句可以 ...
- MySQL学习笔记:delete
使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 语法: DELETE FROM table_name [WHERE Clause] 如果没有指定 WHERE 子句, ...
- Sybase:delete与truncate、drop区别
Sybase:delete与truncate.drop区别 区别: TRUNCATE TABLE TABLENAME:删除内容.释放空间但不删除定义. DELETE FROM TABLENAME:删除 ...
- javascript:delete 删除对象的属性
delete 运算符删除对以前定义的对象属性或方法的引用. 不可以删除的如下: 1通过var定义的变量 var a=1;delete a//false 2 声明后的函数 function a(){}; ...
- 删除数据高级用法:delete,truncate
1.语法: delete 允许使用条件(删除符合条件的数据) 允许使用limit,限制删除的记录数.limit N 常见的是,limit配合order by来使用:先将结果排序,再删除固定数量 ...
- 详解数据库三种删除方法: delete drop truncate
Delete Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行). 删除某一行:Delete from 数据表名称 where 列名称=值: 删除所有行:Del ...
- 面试突击55:delete、drop、truncate有什么区别?
在 MySQL 中,删除的方法总共有 3 种:delete.truncate.drop,而三者的用法和使用场景又完全不同,接下来我们具体来看. 1.delete detele 可用于删除表的部分或所有 ...
随机推荐
- Python - 运算符 - 第五天
Python语言支持以下类型的运算符 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 Python算术运算符 以下假设变量a为10,变量b为21 ...
- [Tomcat源码分析] Eclipse中搭建Apache Tomcat源码调试环境
网上很多文章都推荐使用Ant下载编译,但本地实践中屡屡失败,无法下载. 后来参考 https://blog.csdn.net/xiongyouqiang/article/details/7894107 ...
- css position 5种不同的值的用法
position属性 position属性指定用于元素的定位方法的类型(静态,相对,固定,绝对或粘性). 有五种不同的值: static relative fixed absolute sticky ...
- 【转载】Visual Studio2017如何设置打包发布的WinForm应用程序的版本号
在Visual Studio 2017集成开发工具中,打包发布Winform窗体应用程序的时候,支持设置此次打包发布的Winform窗体应用程序对应的版本号信息,并且支持一次设置后,后续的所有发布版本 ...
- 分分钟搞定Redis编译安装
1. 依赖包安装 yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc- ...
- 一次http请求的过程
http协议(超文本传输协议)是属于应用层的协议,网络分层:应用层(http协议,FTP),传输层(tcp,udp),网络层(ip/ARP),链路层 我们以浏览器向百度发送请求为例: http的发送: ...
- Ubuntu启动器快捷方式文件解析
快捷方式名称 app_name.desktop 路径: /usr/share/applications/app_name.desktop # 简洁快捷方式格式 [Desktop Entry] Name ...
- Springboot前后端分离开发
.1.springboot前后端分离开发之前要配置好很多东西,这周会详细补充博客内容和遇到的问题的解析 2,按照下面流程走一遍 此时会加载稍等一下 pom.xml显示中加上阿里云镜像可以加速下载配置文 ...
- sed与grep练习题
第1章 练习题 第1题 取得/etc/hosts 文件的权限 如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r-- 为 644,要求使用命令取得644 这样的数字. 方法一 ...
- springboot常见问题
什么是 Spring Boot? 为什么要用 Spring Boot? Spring Boot 的核心配置文件有哪几个?它们的区别是什么? Spring Boot 的配置文件有哪几种格式?它们有什么区 ...