【问题标题】:error with const member and default constructorconst 成员和默认构造函数出错
【发布时间】:2013-05-23 15:52:43
【问题描述】:

我有两个版本的 C++ 代码。一个给出问题,另一个不给出:

/*
 * This compiles fine
 */
class base {
    private:
         const char c;
    };

int main() {
    base b(); // compiles fine
}

/* * 这会产生编译错误 */

class base {
    private:
         const char c;
    };

int main() {
    base b; // error: structure 'b' with uninitialized const members

}

注意区别在于“base b()”和“base b”。 我认为两者都会调用默认构造函数,并且由于该类具有 const 字段,因此程序将无法编译。 请帮忙解释一下。

【问题讨论】:

标签: c++ default-constructor


【解决方案1】:

这是因为第一个版本没有创建base 类型的对象,而是声明了一个名为b 的函数,它不接受任何参数并返回base 类型的对象:

base b; // Declares an object b of type base
base b(); // Declares a FUNCTION called b that takes no argument an returns a base

事实上,您可以尝试以下方法来验证是否确实如此:

int main() {
    base b(); // DECLARES function b()
    b(); // INVOKES function b()
}

base b() // DEFINITION of function b()
{
    base c;
    // ...
    return c;
}

现在main() 函数不会再给您带来问题,但b() 函数中的base c; 会。与原始示例中的 base b; 完全一样。为什么?

好吧,因为通常类型为const-qualified 的数据成员应该在您构造对象时立即初始化(就像引用类型的数据成员一样)。一般来说,保证这一点的一种方法是在 constructor's initialization list 中初始化这些数据成员。

例如,这将编译:

class base {
public:
    base() : c('x') { }
private:
    const char c;
};

int main() {
    base b;
}

【讨论】:

  • 谢谢安迪。你解释得很好。
  • @user2414310:很高兴它有帮助 :) 如果这回答了您的问题,请考虑将答案标记为已接受(或您可能喜欢的其他用户提供的任何其他答案)。
【解决方案2】:

常量字符 c;声明时必须定义。 const char c = 'a';例如

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2012-09-01
    • 2011-04-27
    • 2011-09-13
    • 2018-05-13
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多