关于 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++ 中默认构造函数的奇怪编译器行为的主要内容,如果未能解决你的问题,请参考以下文章