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 operatorFoo(const Foo&) = delete; // disallow copy construction
};class Foo_1
{Foo_1(long long); // Can create Foo() with a long longFoo_1(long) = delete; // But can't create it with anything smaller
};class Foo_2
{Foo_2(long long); // Can create Foo() with a long longtemplate<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 disabledA_& 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 disabledreturn 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;
};

GitHub:https://github.com/fengbingchun/Messy_Test

C++11中= delete;的使用相关推荐

  1. C++11中=delete的巧妙用法

    C++11中,当我们定义一个类的成员函数时,如果后面使用"=delete"去修饰,那么就表示这个函数被定义为deleted,也就意味着这个成员函数不能再被调用,否则就会出错. #i ...

  2. C++——C++11中的defalut和delete关键字

    C++的类有四类特殊成员函数 (special member function),它们分别是:默认构造函数.析构函数.拷贝构造函数以及拷贝赋值运算符.这些类的特殊成员函数负责创建.初始化.销毁,或者拷 ...

  3. C/C++基础进阶篇:C++11 中引入的 delete 描述符使用场景

    C++11 中引入的 delete 描述符主要有如下两个使用场景: 禁止编译器自动生成拷贝 Effective C++中提到 通过"私有化 + 只声明.不定义" 的方法禁止编译器生 ...

  4. C++11中的delete关键字

    C++11 中,可在想要 "禁止使用" 的特殊成员函数声明后加 "= delete"(当然也可以声明为私有函数或者保护函数),而需要保留的加 "= d ...

  5. C++11中头文件type_traits介绍

    C++11中的头文件type_traits定义了一系列模板类,在编译期获得某一参数.某一变量.某一个类等等类型信息,主要做静态检查. 此头文件包含三部分: (1).Helper类:帮助创建编译时常量的 ...

  6. C++11中std::addressof的使用

    C++11中的std::addressof获得一个对象的实际地址,即使 operator& 操作符已被重载.它常用于原本要使用 operator& 的地方,它接受一个参数,该参数为要获 ...

  7. C++/C++11中std::string用法汇总

    C++/C++11中std::string是个模板类,它是一个标准库.使用string类型必须首先包含<string>头文件.作为标准库的一部分,string定义在命名空间std中. st ...

  8. C++11中default的使用

    在C+11中,对于defaulted函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量. C++的类有四类特殊成员函数,它们分别是:默认构造函 ...

  9. C++11中unique_ptr的使用

    在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...

最新文章

  1. R语言unlist函数将复杂数据(list列表、dataframe、字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)
  2. 良心直播!看完你的Python入门基础就妥了!
  3. pgsql数据库默认配置事务类型_PostgreSQL基础教程之:初始化配置
  4. 关于从页面中获取用户控件中的其它控件(如DropDownList)事件的方法
  5. 仿QQ6 0侧滑之ViewDragHelper的使用(一)
  6. TypeScript class 的访问控制
  7. 定义DO/DTO/VO等POJO类时,不要设定任何属性默认值
  8. php mysql 常用语句_PHP mysql基本语句指令
  9. 重温CLR(八 ) 泛型
  10. html图片滚动浏览,ul结合CSS制作网页相册滑动浏览效果
  11. python 日期减一天_怎么用Python在指定日期上减去7天?
  12. (转)金融从业人员的核心竞争力在哪里?
  13. 工作4-5年的.NET开发人员也需要有人带带才可以保证软件项目的质量
  14. 解决python中No module named ‘numpy‘问题
  15. 3000字长文:探讨报销系统使用满意度的NPS指标设计
  16. 游戏英文词汇命名——备用
  17. 回想那天让我虎躯一震的bug:Mybatis Ognl引起的异常
  18. 夏黑葡萄水果发朋友圈的文案
  19. 如何安装正版的Xmanager
  20. 使用HVScrollListView 超简单的实现类似股票列表的滑动

热门文章

  1. C指针3:指针变量的运算
  2. GitHub开源的吃鸡版超级玛丽
  3. 5. 编程规范和编程安全指南--JavaScript
  4. keras 的 example 文件 babi_memnn.py 解析
  5. 【机器视觉案例】(13) 脸部和摄像机间的距离测量,自适应文本大小,附python完整代码
  6. Maya硬表面建模学习教程 Master Hard Surface Modeling in Maya 2020
  7. 二叉树 2.0 -- 非递归遍历
  8. springboot redis配置
  9. python之内置函数
  10. linux free命令详解和使用实例(查看内存使用率)