C++:默认构造函数实现

C++: default constructor implementation

本文关键字:实现 构造函数 默认 C++      更新时间:2023-10-16

我有一个从基类继承的类,该基类提供了一个受保护的构造函数,该构造函数为空。

我是否有必要在派生类中实现空白构造函数(和析构函数(,或者编译器会为我生成合适的构造函数(和析构函数(。我正在使用C++ 11。

虽然这篇文章回答了这些问题的一些问题(默认构造函数和析构函数的"=default"与"{}"有何不同?(,但我最感兴趣的是派生类时的行为。

所以我有这样的东西:

template<typename EnumClass>
class IVCounter
{
protected:
//!
//! brief Ensure that this base class is never instantiated
//! directly.
//!
IVCounter() {}

public:
//!
//! brief Virtual destructor
//!
virtual ~IVCounter() {}
};
class Derived: public IVCounter<SomeType>
{
// Do I have to do this?
Derived() 
: IVCounter()
{}
~Derived() {}
};

或者也许在派生中我可以简单地做:

Derived() = default;
~Derived() = default;

或者甚至可能完全省略它?

这里不需要显式构造函数。隐式默认构造函数就足够了。草案 N4659 说 15.6.2 初始化基和成员 [class.base.init] § 13:

在非委托构造函数中,初始化按以下顺序进行:

  • 首先,并且仅对于派生最多的类 (4.5( 的构造函数,虚拟基类初始化于 它们出现在基类有向无环图的深度优先从左到右遍历上的顺序, 其中"从左到右"是基类在派生类基说明符列表中的出现顺序。
  • 然后,直接基类按照它们出现在基说明符列表中的声明顺序进行初始化(无论 mem 初始值设定项的顺序如何(。
  • 然后,按照非静态数据成员在类定义中声明的顺序初始化它们 (同样,无论 mem 初始值设定项的顺序如何(。
  • 最后,执行构造函数主体的复合语句。

隐式默认构造函数只有一个空主体,但对象的构造意味着构造其基类

是的。 编译器将生成空白构造函数,您不需要。

默认生成的构造函数将是public,所以下面就足够

class Derived: public IVCounter<SomeType>
{
};