C++默认构造函数语法

3 c++ default-constructor

我对C++中的默认构造函数有疑问.例如,在A类中,使用此默认构造函数A(){};或有A() = default;什么区别?它们之间的一般区别是什么?

先感谢您!

Pot*_*ter 5

在第一个声明中定义为默认的构造函数被认为不是用户提供的.这基本上就像隐含在C++ 03中一样.聚合类中允许这样的构造函数声明.

struct ag {
    ag() = default;

    int a;
    double b;
};

struct nag {
    nag() {}

    int a;
    double b;
};

ag a = { 5, 12. }; // OK
nag na = { 5, 12. }; // error: not an aggregate and no appropriate constructor
Run Code Online (Sandbox Code Playgroud)

此规则仅= default在类中出现时适用.鉴于此类定义:

struct nag {
    nag();

    int a;
    double b;
}; 
Run Code Online (Sandbox Code Playgroud)

那么这些构造函数定义确实是完全等价的:

nag::nag() {} // 1
nag::nag() = default; // 2
Run Code Online (Sandbox Code Playgroud)

一个explicit默认的构造函数通常禁用空副本列表初始化语法(= {}),并{}作为一个参数或return值.explicit聚合中的显式默认和默认构造函数容易混淆地遵守此规则,因为聚合初始化具有比构造函数初始化更高的优先级.这提供了一种检测类是否为聚合的方法,但您可能不应该这样做.

struct sadistic {
    explicit sadistic() = default;

    // members
};

sadistic se = {}; // OK only if sadistic has no virtual functions, etc.
Run Code Online (Sandbox Code Playgroud)