常量成员和默认构造函数出错 我有两个C++代码版本。一个给出了问题,另一个没有: /* * This compiles fine */ class base { private: const char c; }; int main() { base b(); // compiles fine }

常量成员和默认构造函数出错 我有两个C++代码版本。一个给出了问题,另一个没有: /* * This compiles fine */ class base { private: const char c; }; int main() { base b(); // compiles fine },c++,default-constructor,C++,Default Constructor,/* *这会导致编译错误 */ 请注意,区别在于'base b()'和'base b'。 我认为两者都将调用默认构造函数,并且由于类有一个const字段,程序将无法编译。 请帮助解释。这是因为第一个版本没有创建类型为base的对象,而是声明了一个名为b的函数,该函数不带参数并返回类型为base的对象: base b; // Declares an object b of type base base b(); // Declares a FUNCTION called b that takes

/* *这会导致编译错误 */

请注意,区别在于'base b()'和'base b'。 我认为两者都将调用默认构造函数,并且由于类有一个const字段,程序将无法编译。
请帮助解释。

这是因为第一个版本没有创建类型为
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 cb()函数中的code>将被删除。与
base b完全相同在原始示例中。为什么?

因为在一般情况下,类型为
const
-qualified的数据成员应该在构建对象时立即初始化(就像引用类型的数据成员一样)。通常保证这一点的一种方法是在中初始化这些数据成员

例如,这将编译:

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

int main() {
    base b;
}

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

你可能是C++“最烦人的解析”的另一个受害者(你可以用谷歌搜索):
base b()解析为变量定义,而是将其解析为函数声明——就像
intf()
void g()。(经验法则:编译器可以解释为函数声明的任何东西,它都会。)谢谢Andy。你解释得很好。@ USE2414310:很高兴有帮助:如果这回答了你的问题,请考虑将答案标记为接受(或者任何其他答案,你可能更喜欢)。
class base {
public:
    base() : c('x') { }
private:
    const char c;
};

int main() {
    base b;
}