【问题标题】:Strange Compiler Behavior Regarding Default Constructors in C++关于 C++ 中默认构造函数的奇怪编译器行为
【发布时间】:2010-01-16 05:46:55
【问题描述】:
class TestClass
{
public:
    TestClass(int i) { i = i; };
private:
    int i;
}

class TestClass2
{
private:
    TestClass testClass;
}

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

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

谢谢。

【问题讨论】:

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

标签: c++ compiler-construction constructor default


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多