c – const成员和默认构造函数的错误
作者:互联网
我有两个版本的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字段,程序将无法编译.
请帮忙解释一下.
解决方法:
这是因为第一个版本不创建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()不再给你带来问题了,但是基础c;在b()函数里面会.完全像基数b;在你原来的例子中.为什么?
好吧,因为在构造对象时,应该初始化其类型为const限定的数据成员(就像引用类型的数据成员一样).一般来说,保证这一点的方法是初始化constructor’s initialization list中的那些数据成员.
例如,这将编译:
class base {
public:
base() : c('x') { }
private:
const char c;
};
int main() {
base b;
}
标签:c,default-constructor 来源: https://codeday.me/bug/20190831/1779112.html