gpt4 book ai didi

c++ - 常量成员和默认构造函数出错

转载 作者:太空狗 更新时间:2023-10-29 20:43:03 26 4
gpt4 key购买 nike

我有两个版本的 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() 函数不会再给您带来问题,但是 b() 函数中的 base c; 会。与原始示例中的 base b; 完全一样。为什么?

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

例如,这将编译:

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

int main() {
base b;
}

关于c++ - 常量成员和默认构造函数出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16718509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com