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

时间:2016-12-19 09:20:07

标签: c++ constructor default-constructor

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

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

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

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

VS

class A
{
    // other stuff
};

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

以下摘自 C ++编程语言Stroustrup第4版的书清楚地表明它们是等效的。

明确默认值

由于可以抑制其他默认操作的生成,因此必须有一种方法 取回默认值。此外,有些人更喜欢在程序中看到完整的操作列表 文本即使不需要完整列表也是如此。例如,我们可以写:

class gslice {
    valarray<size_t> size;
    valarray<size_t> stride;
    valarray<size_t> d1;
public:
    gslice() = default;    //<< Explicit default constructor
    ~gslice() = default;
    gslice(const gslice&) = default;
    gslice(gslice&&) = default;
    gslice& operator=(const gslice&) = default;
    gslice& operator=(gslice&&) = default;
    // ...
};

std :: gslice(§40.5.6)的实现片段等效

class gslice {
    valarray<size_t> siz e;
    valarray<size_t> stride;
    valarray<size_t> d1;
public:
    // ...
};