= default 和 = delete
在C++中,声明自定义的类型之后,编译器会默认生成一些成员函数,这些函数被称为默认函数。其中包括:
(1)(默认)构造函数
(2)拷贝(复制)构造函数
(3)拷贝(复制)赋值运算符
(4)移动构造函数
(5)移动赋值运算符
(6)析构函数
另外,编译器还会默认生成一些操作符函数,包括:
(7)operator ,
(8)operator &
(9)operator &&
(10)operator *
(11)operator ->
(12)operator ->*
(13)operator new
(14)operator delete
= default 显示缺省函数
如果类设计者又实现了这些函数的自定义版本后,编译器就不会去生成默认版本。
大多数时候,我们需要声明带参数的构造函数,此时就不会生成默认构造函数,这样会导致类不再是POD类型(可参见随笔《C++11 POD类型》)。
明确默认的函数声明式一种新的函数声明方式,在 C++11 发布时做出了更新。C++11 允许添加 =default 说明符到函数声明的末尾,以将该函数声明为显示默认构造函数。这就使得编译器为显示默认函数生成了默认实现,它比手动编程函数更加有效。
= delete 显示删除函数
另一方面,有时候可能需要限制一些默认函数的生成。
例如:需要禁止拷贝构造函数的使用。以前通过把拷贝构造函数声明为private访问权限,这样一旦使用编译器就会报错。
而在 C++11 中,只要在函数的定义或者声明后面加上”= delete”就能实现这样的效果(相比较,这种方式不容易犯错,且更容易理解)。
在C ++ 11之前,操作符delete 只有一个目的,即释放已动态分配的内存。而C ++ 11标准引入了此操作符的另一种用法,即:禁用成员函数的使用。这是通过附加= delete来完成的; 说明符到该函数声明的结尾。
使用’= delete’说明符禁用其使用的任何成员函数称为expicitly deleted函数。
类的函数声明后面的“default”是什么意思?
这是一个新的c++ 11特性。
这意味着你想使用编译器生成的函数版本,因此不需要指定函数体。
你也可以使用= delete来指定你不希望编译器自动生成该函数。
随着移动构造函数和移动赋值操作符的引入,何时生成构造函数、析构函数和赋值操作符的自动版本的规则变得相当复杂。
使用= default和= delete可以让事情变得更简单,因为你不需要记住规则: 只需说出你想要发生什么。