C++—— =delete和=default
函数定义中末尾会带这两个表达式,这分别表示deleted function(弃置函数)和default function(默认函数)。
其中=default仅对特殊成员函数与比较运算符函数 (C++20 起)允许。
特殊成员函数:
比较运算符函数:==、!=、<、<=、> 和 >=。(形如,operator<())
定义了 operator<=> 的类自动获得由编译器生成的运算符 ==、!=、<、<=、> 和 >=。类可以将 operator<=> 定义为预置的,这种情况下编译器亦将为该运算符生成代码。(C++20起)
示例:(仅对弃置函数与默认特殊成员函数做示例)。
#include <iostream>
using namespace std;
class A
{
private:
int a;
int b;
public:
//默认无参数构造函数
A() = delete;
A(const int &aa,const int &bb):a(aa),b(bb){}
void printA(){cout<<a<<","<<b<<endl;}
void printB()=delete;
~A()=default;
//未定义operator=
};
class B
{
private:
int a;
int b;
public:
//默认无参数构造函数
B() = delete;
B(const int &aa,const int &bb):a(aa),b(bb){}
void printA(){cout<<a<<","<<b<<endl;}
void printB()=delete;
~B()=default;
B& operator=(const B& aa){
cout<<"B="<<endl;
a = aa.a;b=aa.b;
};
};
class C
{
private:
int a;
int b;
public:
//默认无参数构造函数
C() = delete;
C(const int &aa,const int &bb):a(aa),b(bb){}
void printA(){cout<<a<<","<<b<<endl;}
~C()=default;
C& operator=(const C& aa)=delete;
};
int main(){
//A a;//提示无法引用“A”的默认构造函数--它是已删除的函数,无法编译
A b(1,2);
//b.printB();//提示其是已删除的函数
A c = b;//此调用为调用默认复制构造函数,虽然无显示定义,以下会做一个示例
A d(3,4);
d = c;
d.printA();//输出1 2
B d1(3,4);B c1(1,2);
d1 = c1;//输出B=
d1.printA();//输出1 2
C d2(3,4);C c2(1,2);
//d2 = c2;//提示已删除,编译无法通过
return 0;
}
总结;对于特殊成员函数编辑器会自动定义。在以上示例中表示当你指定某一成员函数为delete funtion时,就无法调用该函数,并且会使得调用它的代码无法通过编译。