当前位置: 首页 > news >正文

C++11中“= delete;“的使用

C++11中,对于deleted函数,编译器会对其禁用,从而避免某些非法的函数调用或者类型转换,从而提高代码的安全性。

对于 C++ 的类,如果程序员没有为其定义特殊成员函数,那么在需要用到某个特殊成员函数的时候,编译器会隐式的自动生成一个默认的特殊成员函数,比如默认的构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。

为了能够让程序员显式的禁用某个函数,C++11标准引入了一个新特性:deleted函数。程序员只需在函数声明后加上”=delete;”,就可将该函数禁用

deleted函数特性还可用于禁用类的某些转换构造函数,从而避免不期望的类型转换。

deleted函数特性还可以用来禁用某些用户自定义的类的new操作符,从而避免在自由存储区创建类的对象。

必须在函数第一次声明的时候将其声明为deleted函数,否则编译器会报错。即对于类的成员函数而言,deleted函数必须在类体里(inline)定义,而不能在类体外(out-of-line)定义。

虽然defaulted函数特性规定了只有类的特殊成员函数才能被声明为defaulted函数,但是deleted函数特性并没有此限制。非类的成员函数,即普通函数也可以被声明为deleted函数

In C++11, defaulted and deleted functions give you explicit control over whether the special member functions are automatically generated.

The opposite of a defaulted function is a deleted function.

Deleted functions are useful for preventing object copying, among the rest. Recall that C++ automatically declares a copy constructor and an assignment operator for classes. To disable copying, declare these two special member functions “=delete”.

The delete specifier can also be used to make sure member functions with particular parameters aren’t called.

=default: it means that you want to use the compiler-generated version of that function, so you don't need to specify a body.

=delete: it means that you don't want the compiler to generate that function automatically.

下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

#include "delete.hpp"
#include <iostream>
 
//
// reference: http://www.learncpp.com/cpp-tutorial/b-6-new-virtual-function-controls-override-final-default-and-delete/
class Foo
{
	Foo& operator=(const Foo&) = delete; // disallow use of assignment operator
	Foo(const Foo&) = delete; // disallow copy construction
};
 
class Foo_1
{
	Foo_1(long long); // Can create Foo() with a long long
	Foo_1(long) = delete; // But can't create it with anything smaller
};
 
class Foo_2
{
	Foo_2(long long); // Can create Foo() with a long long
	template<typename T> Foo_2(T) = delete; // But can't create it with anything else
};
 
///
// reference: http://www.bogotobogo.com/cplusplus/C11/C11_default_delete_specifier.php
class A_
{
public:
	A_(int a){};
	A_(double) = delete;         // conversion disabled
	A_& operator=(const A_&) = delete;  // assignment operator disabled
};
 
int test_delete1()
{
	A_ a_(10);     // OK
	// A_ b(3.14);   // Error: conversion from double to int disabled
	// a = b;       // Error: assignment operator disabled
 
	return 0;
}
 
 
// reference: https://msdn.microsoft.com/zh-cn/library/dn457344.aspx
struct widget
{
	// deleted operator new prevents widget from being dynamically allocated.
	void* operator new(std::size_t) = delete;
};

 

相关文章:

  • C++Error2208:...尝试引用已删除的函数
  • Ninja 构建系统
  • ICU
  • 交叉编译详解
  • GYP,GN和Ninja
  • Visual C++ 新增功能(2003 - 2015)
  • v8引擎编译全记录2021-2-23
  • c++ mutex
  • windows标准控件的介绍与使用
  • VS2019安装 VisualSVN Server 插件
  • cef / JavaScript集成
  • MFC RichEdit使用方法
  • 代码页
  • WM_COMMAND介绍和用法
  • 堆内存和栈内存
  • 《深入 React 技术栈》
  • CSS 提示工具(Tooltip)
  • js正则,这点儿就够用了
  • webgl (原生)基础入门指南【一】
  • 第十八天-企业应用架构模式-基本模式
  • 给github项目添加CI badge
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 记录:CentOS7.2配置LNMP环境记录
  • 前嗅ForeSpider教程:创建模板
  • 树莓派 - 使用须知
  • 网页视频流m3u8/ts视频下载
  • 温故知新之javascript面向对象
  • 我看到的前端
  • 一份游戏开发学习路线
  • 自定义函数
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​低代码平台的核心价值与优势
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • $forceUpdate()函数
  • (4)事件处理——(7)简单事件(Simple events)
  • (C语言)二分查找 超详细
  • (TOJ2804)Even? Odd?
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (一)WLAN定义和基本架构转
  • (转)详解PHP处理密码的几种方式
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET程序员迈向卓越的必由之路
  • .NET多线程执行函数
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @media screen 针对不同移动设备
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决