=default, =delete

来源:互联网 发布:淘宝特卖-连衣裙 编辑:程序博客网 时间:2024/05/21 06:42

=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&);}