c++6个默认函数

在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)

如果类设计者又实现了这些函数的自定义版本后,编译器就不会去生成默认版本

 #include <iostream>
  using namespace std;
  
  class Test 
  {
  public:
      Test() = default;  // 显式指定缺省函数
      Test(int i) : data(i) {}
  
 private:
     int data;
 };
 
 int main()
 {
     std::cout << std::is_pod<Test>::value << std::endl;  // 1
 }

显式删除函数(=delete)

另一方面,有时候可能需要限制一些默认函数的生成。

例如:需要禁止拷贝构造函数的使用。以前通过把拷贝构造函数声明为private访问权限,这样一旦使用编译器就会报错。

而在C++11中,只要在函数的定义或者声明后面加上”= delete”就能实现这样的效果(相比较,这种方式不容易犯错,且更容易理解):

#include <iostream>
using namespace std;

class Test
{
public:
    Test() = default;  // 显式指定缺省函数
    Test(int i) : data(i) {}
    Test(const Test& t) = delete; // 显式删除拷贝构造函数

private:
    int data;
};

int main()
{
    Test objT1;
//    Test objT2(objT1); // 无法通过编译
}

其他应用

(1)= default和= delete 能够更加精准的控制类的默认函数版本。其中,= default同样也能在类外的定义中修饰成员函数:

总之,default只能用于6个特殊成员函数,但delete可用于任何成员函数。

posted @ 2020-05-12 14:17  卖雨伞的小男孩  阅读(595)  评论(0编辑  收藏  举报