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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值