C++—— =delete和=default

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时,就无法调用该函数,并且会使得调用它的代码无法通过编译。

posted @ 2020-07-16 08:13  马里捡鱼  阅读(104)  评论(0)    收藏  举报