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

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

我已经知道明确定义的默认construtor(即没有参数)和明确定义的默认构造函数(即使用关键字default)之间存在一些差异,从这里:The new keyword =default in C++11

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

class A
{
public:
    A() = default;
    // other stuff
};

VS

class A
{
    // other stuff
};

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

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

最佳答案 = default的目的是使隐式定义显式化.隐式定义版本与显式默认版本之间的任何差异仅限于由于存在显式声明而出现的一些其他可能性.

>隐式声明/定义的构造函数始终是公共的,而明确定义的默认构造函数的访问控制由您自己控制.
>定义默认的默认构造函数使您可以使用属性对其进行注释.例如:

$cat a.cpp 
class A
{
public:
    [[deprecated]] A() = default;
};

int main()
{
    A a;
}

$g++ -std=c++14 a.cpp
a.cpp: In function ‘int main()’:
a.cpp:9:7: warning: ‘constexpr A::A()’ is deprecated [-Wdeprecated-declarations]
     A a;
       ^
a.cpp:4:20: note: declared here
     [[deprecated]] A() = default;
                    ^
点赞