默认构造函数与隐式构造函数

NPS*_*NPS 5 c++ constructor default-constructor

可能有人已经问过这个问题,但在谷歌上搜索“默认”、“默认”、“明确”等并没有给出好的结果。但无论如何。

我已经知道显式定义的默认构造函数(即没有参数)和显式定义的默认构造函数(即带有关键字default)之间存在一些差异,从这里开始:C++11 中的新关键字 =default

但是显式定义的默认构造函数和隐式定义的构造函数(即当用户根本不编写它时)之间有什么区别?

class A
{
public:
    A() = default;
    // other stuff
};
Run Code Online (Sandbox Code Playgroud)

对比

class A
{
    // other stuff
};
Run Code Online (Sandbox Code Playgroud)

想到的一件事是,当存在非默认构造函数时,用户还必须明确定义默认构造函数。但是还有其他区别吗?

编辑:我最感兴趣的是知道是否有任何充分的理由来编写A() = default;而不是完全省略构造函数(当然,假设它是该类唯一明确定义的构造函数)。

Leo*_*eon 2

的目的= default是使隐式定义显式化。隐式定义版本和显式默认版本之间的任何差异都仅限于由于显式声明的存在而出现的一些附加可能性。

\n\n
    \n
  1. 隐式声明/定义的构造函数总是public,而显式定义的默认构造函数的访问控制由您自己控制。

  2. \n
  3. 定义默认的默认构造函数使您可以使用属性对其进行注释。例如:

    \n\n
    $ cat a.cpp \nclass A\n{\npublic:\n    [[deprecated]] A() = default;\n};\n\nint main()\n{\n    A a;\n}\n\n$ g++ -std=c++14 a.cpp\na.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\na.cpp:9:7: warning: \xe2\x80\x98constexpr A::A()\xe2\x80\x99 is deprecated [-Wdeprecated-declarations]\n     A a;\n       ^\na.cpp:4:20: note: declared here\n     [[deprecated]] A() = default;\n                    ^\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n