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

时间:2010-01-16 05:46:55

标签: c++ compiler-construction constructor default

class TestClass
{
public:
    TestClass(int i) { i = i; };
private:
    int i;
}

class TestClass2
{
private:
    TestClass testClass;
}

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

只有当某人在代码中的其他地方实例化TestClass2时,我们才会收到编译错误。编译器在这做什么?看起来很奇怪......

感谢。

3 个答案:

答案 0 :(得分:4)

如果指定非默认构造函数而未指定默认构造函数,则默认构造函数不存在。

在尝试像在TestClass2中那样显式调用它之前,您不会尝试调用默认构造函数。如果您在TestClass2中指定了一个适当初始化TestClass的构造函数,那么您将没有错误。

class TestClass2
{
   TestClass m_testClass;
public:
   TestClass2():m_testClass(2){}
};

也尽可能使用初始化列表进行性能测试,如果调用参数名称和成员变量名称相同,则可能会让其他人感到困惑。

答案 1 :(得分:2)

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

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

(这些只是我的推测。请查看C ++标准,了解实际发生的情况。)

答案 2 :(得分:0)

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