=default, =delete

=default, =delete

=default

如果自己定义了一个ctor,那么编译器就不会再合成一个default ctor
如果强制加上=default, 编译器就会合成一个default ctor

=delete

禁止编译器合成

当被需要时c++编译器能合成的四类函数

构造,拷贝构造,拷贝赋值,析构函数

class Test {
public:
    Test(int i, int j):d1(i), d2(j) {}          //默认构造函数
    Test(const Test& t) = delete;               //拷贝构造
    Test(Test&&) = default;                     
    Test& operator=(const Test&) = default;     //拷贝赋值
    Test& operator=(const Test&&) = delete;
    virtual ~Test() {}                         //析构
private:
    int d1, d2;
}

构造函数可以有多个版本,拷贝构造,拷贝赋值,析构只能有一个版本
下述打//的会编译出错

class Foo {
public:
    Foo(int i): num(i){}
    Foo() = default;

    Foo(const Foo& x):num(x.num) {}
    //Foo(const Foo&) =default;         //不能重载
    //Foo(const Foo&) =delete;          //已经写了,不能delete

    Foo& operator=(const Foo& x) {
        num = x.num;
        return *this;
    }
    //Foo& operator=(const Foo& x) =default;   //不能重载
    //Foo& operator=(const Foo& x) =delete;    //已经写了,不能delete

    //void func1() = default;   //普通函数不能default,可以delete(没意义)
    void fun2() = delete;

    //~Foo() = delete;
    ~Foo() =default;

private:
    int num;
}

实现不可拷贝的类

只要与拷贝有关的构造函数不存在即可

class Nocopy {
public:
    Nocopy() = default;
    Nocopy(const Nocopy&) = delete;
    Nocopy& operator=(const Nocopy&) = delete;
    ~Nocopy() = default;
    //......
}

设计成友元能拷贝

class uncopyable {
protected:
    uncopyable() {}
    ~uncopyable() {}
private:
    uncopyable(const uncopyable&);
    const uncopyable& operator=(const uncopyable&);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值