我有两个版本的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字段,程序将无法编译。 请帮忙解释一下。
答案 0 :(得分: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
- 限定的数据成员应该在构造对象时立即初始化(就像引用类型的数据成员一样)。一般来说,保证这一点的方法是在constructor's initialization list中初始化这些数据成员。
例如,这将编译:
class base {
public:
base() : c('x') { }
private:
const char c;
};
int main() {
base b;
}
答案 1 :(得分:1)
const char c;必须在声明时定义。 const char c =' a&#39 ;;例如