什么是抽象 class 没有数据成员的编译器生成的构造函数
What is Compiler Generated constructor for abstract class no data members
我是 运行 静态分析工具,但遇到错误,因为抽象 class 没有数据成员,也没有构造函数。
给定一个没有数据成员的摘要class:
class My_Interface
{
public:
virtual void interface_function(void) = 0;
};
- 编译器是否生成任何构造函数?
- 如果生成一个构造器,它的内容是什么?
- 如果生成一个构造函数,会不会被一个构造函数淘汰
优化级别?
静态分析中的规则文档说:
如果你没有在class中编写至少一个构造函数,编译器将
默认为你写一个 public 构造函数。此规则检测您是否
不要声明至少一个构造函数。
规则文档引用了 Scott Meyers,"Effective C++: 55 Specific Ways to Improve your Programs and Design",第三版。
我的理解是编译器不会为上述情况生成构造函数。
编辑 1:
这不是许多构造函数问题的重复,因为:
- 这个没有数据成员。
- 这不是问是否需要构造函数,而是问会发生什么
当未提供构造函数时。
- 这是 C++ 语言。
即使在这种情况下,编译器至少在理论上合成了一个构造函数。即使您无法创建此 class 的实例,构造函数也会在创建派生 class 的过程中被调用(覆盖 interface_function
,因此它可以被实例化)。
鉴于这基本上是一个纯接口 class,构造函数可能不会做任何事情,所以大多数编译器可能会优化它(即使你不告诉它优化代码)。
- Are any constructors generated by the compiler?
是的。一些。首先,来自 [class.ctor]:
A default constructor for a class X is a constructor of class X that either has no parameters or else each
parameter that is not a function parameter pack has a default argument. If there is no user-declared constructor
for class X, a non-explicit constructor having no parameters is implicitly declared as defaulted (8.4).
An implicitly-declared default constructor is an inline public member of its class. A defaulted default
constructor for class X is defined as deleted if:
后面有几个要点,其中 none 适用。所以我们有相当于:
My_Interface() = default;
然后,来自[class.copy]:
If the class definition does not explicitly declare a copy constructor, a non-explicit one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy
constructor is defined as deleted; otherwise, it is defined as defaulted (8.4).
所以我们有:
My_Interface(const My_Interface&) = default;
还有:
If the definition of a class X does not explicitly declare a move constructor, a non-explicit one will be implicitly
declared as defaulted if and only if
(9.1) — X does not have a user-declared copy constructor,
(9.2) — X does not have a user-declared copy assignment operator,
(9.3) — X does not have a user-declared move assignment operator, and
(9.4) — X does not have a user-declared destructor.
所以我们还有:
My_Interface(My_Interface&& ) = default;
- If a constructor is generated, what would it's content be?
三个都生成了,三个都= default;
- If a constructor is generated, would it be eliminated by an optimization level?
三个构造函数中的 None 是微不足道的 因为 My_Interface
有一个虚函数。因此,至少,vtable 需要是 initialized/copied。所以 某些事情 将不得不发生,即使 initialize/copy/move 没有任何成员。
Q1。编译器是否生成任何构造函数?
答:是的。来自 C++11 标准:
12.1 Constructors
5 A default constructor for a class X
is a constructor of class X
that can be called without an argument. If
there is no user-declared constructor for class X
, a constructor having no parameters is implicitly declared
as defaulted (8.4). An implicitly-declared default constructor is an inline public
member of its class.
我没有在标准中看到任何可以回答其他两个问题的内容。但是,在您的情况下,由于存在 virtual
成员函数,默认构造函数必须至少设置对象的虚拟 table。
我是 运行 静态分析工具,但遇到错误,因为抽象 class 没有数据成员,也没有构造函数。
给定一个没有数据成员的摘要class:
class My_Interface
{
public:
virtual void interface_function(void) = 0;
};
- 编译器是否生成任何构造函数?
- 如果生成一个构造器,它的内容是什么?
- 如果生成一个构造函数,会不会被一个构造函数淘汰 优化级别?
静态分析中的规则文档说:
如果你没有在class中编写至少一个构造函数,编译器将
默认为你写一个 public 构造函数。此规则检测您是否
不要声明至少一个构造函数。
规则文档引用了 Scott Meyers,"Effective C++: 55 Specific Ways to Improve your Programs and Design",第三版。
我的理解是编译器不会为上述情况生成构造函数。
编辑 1:
这不是许多构造函数问题的重复,因为:
- 这个没有数据成员。
- 这不是问是否需要构造函数,而是问会发生什么 当未提供构造函数时。
- 这是 C++ 语言。
即使在这种情况下,编译器至少在理论上合成了一个构造函数。即使您无法创建此 class 的实例,构造函数也会在创建派生 class 的过程中被调用(覆盖 interface_function
,因此它可以被实例化)。
鉴于这基本上是一个纯接口 class,构造函数可能不会做任何事情,所以大多数编译器可能会优化它(即使你不告诉它优化代码)。
- Are any constructors generated by the compiler?
是的。一些。首先,来自 [class.ctor]:
A default constructor for a class X is a constructor of class X that either has no parameters or else each parameter that is not a function parameter pack has a default argument. If there is no user-declared constructor for class X, a non-explicit constructor having no parameters is implicitly declared as defaulted (8.4). An implicitly-declared default constructor is an inline public member of its class. A defaulted default constructor for class X is defined as deleted if:
后面有几个要点,其中 none 适用。所以我们有相当于:
My_Interface() = default;
然后,来自[class.copy]:
If the class definition does not explicitly declare a copy constructor, a non-explicit one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defined as defaulted (8.4).
所以我们有:
My_Interface(const My_Interface&) = default;
还有:
If the definition of a class X does not explicitly declare a move constructor, a non-explicit one will be implicitly declared as defaulted if and only if
(9.1) — X does not have a user-declared copy constructor,
(9.2) — X does not have a user-declared copy assignment operator,
(9.3) — X does not have a user-declared move assignment operator, and
(9.4) — X does not have a user-declared destructor.
所以我们还有:
My_Interface(My_Interface&& ) = default;
- If a constructor is generated, what would it's content be?
三个都生成了,三个都= default;
三个构造函数中的
- If a constructor is generated, would it be eliminated by an optimization level?
None 是微不足道的 因为 My_Interface
有一个虚函数。因此,至少,vtable 需要是 initialized/copied。所以 某些事情 将不得不发生,即使 initialize/copy/move 没有任何成员。
Q1。编译器是否生成任何构造函数?
答:是的。来自 C++11 标准:
12.1 Constructors
5 A default constructor for a class
X
is a constructor of classX
that can be called without an argument. If there is no user-declared constructor for classX
, a constructor having no parameters is implicitly declared as defaulted (8.4). An implicitly-declared default constructor is aninline public
member of its class.
我没有在标准中看到任何可以回答其他两个问题的内容。但是,在您的情况下,由于存在 virtual
成员函数,默认构造函数必须至少设置对象的虚拟 table。