C++11 '=default','=delete'

问题:=delete与=\default有什么好处?

1 =default的好处

通常我们在开发中会遇到这种尴尬的情况:当我们自定义了一个构造函数。那么默认的构造函数、拷贝构造、移动拷贝构造函数。都不再自动生成。
注意一点:自定义了析构函数,不会影响编译器自动生成默认的构造函数。
当我们在class A中自定义了A(int param)构造函数时,再采用A a方式默认构造一个对象的时候,编译器会提示没有这样的构造方法。因此在C++11之前,我们需要手动构造一系列我们可能会需要的默认构造函数。非常的麻烦

这个为题在C++11中得到了解决:

class A 
{
    public:
        A(int a)
        {
            // do some things you want
        }
        A() = default;
};

int main(void)
{
    A a(3);         // ok,此处各个版本的C++都不会存在问题
    A b();          // 由于=default的存在,此处ok
    A c = b;        // 惊奇的发现,拷贝构造的自动实现也被加上了。
                    // 因此一个=default解决了很多不必要的麻烦
    return 0;
}

2 =delete的优点

C++11版本之前,我们想实现一个类不能拷贝构造需要这么写:

class A
{
    public:
        A() {}
        ~A() {}
    private:
        A(A &a) {}  // 如果此处{}替换成了;将会无比的麻烦
        A &operator=(A & a) {}
};

在C++11中,我们可以通过下面的方式来实现一个noncopyable函数

class noncopyable
{
    public:
        noncopyable() = default;
        ~noncopyable() = default;
    private:
        noncopyable(const noncopyable&) = delete;
        void operator=(const noncopyable&) = delete;
};

注意一点:=delete是可以针对任何成员函数的,不局限与构造与析构函数

当我们用=delete修饰了基类的拷贝构造函数时,子类的拷贝构造如果没有明确的自定义的话。子类的拷贝构造也是失效的