关于 C++ 中默认构造函数的奇怪编译器行为

Posted

技术标签:

【中文标题】关于 C++ 中默认构造函数的奇怪编译器行为【英文标题】:Strange Compiler Behavior Regarding Default Constructors in C++ 【发布时间】:2010-01-16 05:46:55 【问题描述】:
class TestClass

public:
    TestClass(int i)  i = i; ;
private:
    int i;


class TestClass2

private:
    TestClass testClass;

为什么即使我们没有提供默认构造函数,上面的代码也能正常编译?

只有当有人在代码的其他地方实例化 TestClass2 时,我们才会收到编译错误。编译器在这里做什么?好像很奇怪……

谢谢。

【问题讨论】:

如果我是你,我会避免使用相同的参数作为方法的参数和对象的属性......你会遇到奇怪的错误。 【参考方案1】:

指定非默认构造函数而不指定默认构造函数时,默认构造函数不存在。

在您尝试显式调用默认构造函数之前,您不会尝试调用默认构造函数,就像在 TestClass2 中一样。如果您改为在 TestClass2 中指定一个适当初始化 TestClass 的构造函数,则不会出现错误。

class TestClass2

   TestClass m_testClass;
public:
   TestClass2():m_testClass(2)
;

还尽可能使用初始化列表来提高性能,如果您将参数名称和成员变量名称称为相同的名称,可能会对其他人造成混淆。

【讨论】:

【参考方案2】:

因为您不需要默认构造函数来确定大小/类型信息/等。 TestClass2

第一次需要默认构造函数是在某处启动TestClass2 时。这是编译器发现默认构造函数不存在并抱怨的时候。

(这些只是我的推测。检查 C++ 标准以了解实际情况。)

【讨论】:

【参考方案3】:

编译器抱怨从未发生的事情是让开发人员关闭所有警告的快速方法。

【讨论】:

以上是关于关于 C++ 中默认构造函数的奇怪编译器行为的主要内容,如果未能解决你的问题,请参考以下文章

:构造函数语意学之Default constructor的构造操作

默认复制/移动构造函数时 GDB 中的奇怪行为

默认构造函数的奇怪错误(C++)

C++构造和析构

C++类和对象中

构造函数的调用规则