c++ - 默认构造函数与隐式构造函数

标签 c++ constructor default-constructor

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

我已经知道显式定义的默认构造函数(即没有参数)和显式定义的默认构造函数(即使用关键字 default)之间存在一些差异,来自此处:The new keyword =default in C++11

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

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

对比

class A
{
    // other stuff
};

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

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

最佳答案

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

  1. 隐式声明/定义的构造函数始终是public,而显式定义的默认构造函数的访问控制在您自己的控制之下。

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

    $ 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;
                        ^
    

关于c++ - 默认构造函数与隐式构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41219291/

相关文章:

c++ - 如果从 C++ 中的构造函数抛出异常,如何清理已初始化的资源

c++ - Amqpcpp undefined symbol

c++ - 从 MySQL 选择 LONGTEXT 列时 CRecordset 出现 "out of memory"异常

javascript - 这在 JavaScript 子类中不可用

c++ - 将自身类型作为参数的新 C++ 模板类构造函数

.NET结构概念问题

c++ - 如果该类不是 `copy constructor`,是否可以移动对象?

java - 我怎样才能让我的构造函数同步?

c++ - 下面显示的片段在 Coliru 和 Ideone 中编译,但根据 iso § 8.5 p6 它不应该,或者我错过了什么?

c# - 我们真的可以将无参数构造函数称为默认构造函数吗?