3

我有两个版本的 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 字段,因此程序将无法编译。请帮忙解释一下。

4

2 回答 2

4

这是因为第一个版本不创建类型的对象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()不会再给你带来问题了,但是函数base c;内部b()会。与原始示例中的完全一样base b;。为什么?

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

例如,这将编译:

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

int main() {
    base b;
}
于 2013-05-23T15:53:48.513 回答
1

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

于 2013-05-23T15:57:19.120 回答