class TestClass
{
public:
TestClass(int i) { i = i; };
private:
int i;
}
class TestClass2
{
private:
TestClass testClass;
}
为什么即使我们没有提供默认构造函数,上面的代码也能正常编译?
只有当某人在代码中的其他地方实例化TestClass2时,我们才会收到编译错误。编译器在这做什么?看起来很奇怪......
感谢。
答案 0 :(得分:4)
如果指定非默认构造函数而未指定默认构造函数,则默认构造函数不存在。
在尝试像在TestClass2中那样显式调用它之前,您不会尝试调用默认构造函数。如果您在TestClass2中指定了一个适当初始化TestClass的构造函数,那么您将没有错误。
即
class TestClass2
{
TestClass m_testClass;
public:
TestClass2():m_testClass(2){}
};
也尽可能使用初始化列表进行性能测试,如果调用参数名称和成员变量名称相同,则可能会让其他人感到困惑。
答案 1 :(得分:2)
因为您不需要默认构造函数来确定大小/类型信息/等。 TestClass2
。
第一次需要默认构造函数是在某处启动TestClass2
的时候。这是当编译器发现默认构造函数不存在并抱怨时。
(这些只是我的推测。请查看C ++标准,了解实际发生的情况。)
答案 2 :(得分:0)
编译器抱怨从未发生的事情是让开发人员关闭所有警告的快捷方法。