[C++11 类的改进] --- 继承控制:=default和=delete

Posted Overboom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C++11 类的改进] --- 继承控制:=default和=delete相关的知识,希望对你有一定的参考价值。

在 C++ 中声明自定义的类,编译器会默认帮助程序员生成一些他们未自定义的成员函数。这样的函数版本被称为” 默认函数”。这样的函数一共有六个:

  • 无参构造函数:创建类对象
  • 拷贝构造函数:拷贝类对象
  • 移动构造函数:拷贝类对象
  • 拷贝赋值函数:类对象赋值
  • 移动赋值函数:类对象赋值
  • 析构函数
:销毁类对象
    在 C++ 语法规则中,一旦程序员实现了这些函数的自定义版本,则编译器不会再为该类自动生成默认版本。

有时程序员会忘记上面提到的规则,最常见的是声明了带参数的构造,如果还需要无参构造函数,这时候必须定义出不带参数的版本。不过通过编译器的提示,这样的问题通常会得到更正。但更为严重的问题是,一旦声明了自定义版本的构造函数,则有可能导致我们定义的类型不再是 POD 类型,我们便不再能够享受 POD 类型为我们带来的便利。

对于上面提到的这些,我们无需过度担心,因为 C++11 非常贴心地为我们提供了解决方案,就是使用 =default 。

在 C++11 标准中称 = default 修饰的函数为显式默认【缺省】(explicit defaulted)函数,而称 =delete 修饰的函数为删除(deleted)函数或者显示删除函数。

C++11 引入显式默认和显式删除是为了增强对类默认函数的控制,让程序员能够更加精细地控制默认版本的函数。

1 =default

我们可以在类内部修饰满足条件的类函数为显示默认函数,也可以在类定义之外修饰成员函数为默认函数。下面举例说明:
1> 类内部指定函数为默认函数

class Base

public:
    Base() = default;
    Base(const Base& obj) = default;
    Base(Base&& obj) = default;
    Base& operator= (const Base& obj) = default;
    Base& operator= (Base&& obj) = default;
    ~Base() = default;
;

2> 类外部指定函数为默认函数

// 类定义
class Base

public:
    Base();
    Base(const Base& obj);
    Base(Base&& obj);
    Base& operator= (const Base& obj);
    Base& operator= (Base&& obj);
    ~Base();
;
// 在类定义之外指定成员函数为默认函数
Base::Base() = default;
Base::Base(const Base& obj) = default;
Base::Base(Base&& obj) = default;
Base& Base::operator= (const Base& obj) = default;
Base& Base::operator= (Base&& obj) = default;
Base::~Base() = default;

2 =delete

=delete 表示显示删除,显式删除可以避免用户使用一些不应该使用的类的成员函数,使用这种方式可以有效的防止某些类型之间自动进行隐式类型转换产生的错误。下面举例说明:

class Base

public:
    Base() = default;
    Base(const Base& obj) = delete;	//禁用拷贝构造函数
    Base& operator= (const Base& obj) = delete; //禁用 = 进行对象复制
;

int main()

    Base b;
    Base tmp1(b);    // error
    Base tmp = b;    // error
    return 0;

以上是关于[C++11 类的改进] --- 继承控制:=default和=delete的主要内容,如果未能解决你的问题,请参考以下文章

[C++11 类的改进] --- 继承控制:final和override

[C++11 类的改进] --- 继承控制:=default和=delete

[C++11 类的改进] --- 继承控制:=default和=delete

[C++11 类的改进] --- 继承控制:=default和=delete

[C++11 类的改进] --- 继承构造函数和委托构造函数

[C++11 类的改进] --- 继承构造函数和委托构造函数