详解在C++中显式默认设置的函数和已删除的函数的方法

2020-01-06 14:32:52王冬梅
易采站长站为您分析在C++中显式默认设置的函数和已删除的函数的方法,文中讲到了C++11标准中的新特性,需要的朋友可以参考下  

在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数。已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型提升,这会导致意外的函数调用。
显式默认设置的函数和已删除函数的好处
在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数、复制构造函数、复制赋值运算符和析构函数。这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构。也就是说,可以创建、复制和销毁它们而无需任何额外编码工作。C++11 会将移动语义引入语言中,并将移动构造函数和移动赋值运算符添加到编译器可自动生成的特殊成员函数的列表中。
这对于简单类型非常方便,但是复杂类型通常自己定义一个或多个特殊成员函数,这可以阻止自动生成其他特殊成员函数。实践操作:

  • 如果显式声明了任何构造函数,则不会自动生成默认构造函数。
  • 如果显式声明了虚拟析构函数,则不会自动生成默认析构函数。
  • 如果显式声明了移动构造函数或移动赋值运算符,则:
    1. 不自动生成复制构造函数。
    2. 不自动生成复制赋值运算符。
    • 如果显式声明了复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符或析构函数,则:
      1. 不自动生成移动构造函数。
      2. 不自动生成移动赋值运算符。

      注意

      此外,C++11 标准指定将以下附加规则:

      • 如果显式声明了复制构造函数或析构函数,则弃用复制赋值运算符的自动生成。