声明一个类的const实例

时间:2011-01-12 21:37:48

标签: c++ const

假设我的课程定义如下:

class foo{};

现在,这是完全可以接受的;

foo f;

怎么会出现编译错误? (uninitialized const ‘f’

const foo f;

为什么我们必须这样做?

const foo f = foo();

我知道为什么我们不能这样做..

const foo f(); // though it compiles..

有趣的是,以下内容有效:

const std::string f;

那么foo缺少什么?

我意识到那里有三个问题,这是一个糟糕的形式,但我希望有人可以在一个答案中为我解决这个问题。

编辑:如果这是愚蠢的话,请随时关闭它......

4 个答案:

答案 0 :(得分:47)

您的类是POD(主要是因为它不提供默认构造函数)。 POD变量在声明时初始化。就是这样:

foo x;

不会将x初始化为有意义的值。这必须单独完成。现在,当您将其声明为const时,这可能永远不会发生,因为您无法再分配或更改x

考虑与int的等价:

int x; // legal
const int y; // illegal

正如您所注意到的,使用std::string代替foo进行编译。那是因为std::string不是POD。解决您的困境的一个简单方法是为foo提供默认构造函数:

class foo {
public:
    foo() { }
};

现在您的const foo x;代码已编译。

答案 1 :(得分:6)

在空类的情况下引发错误是一个已知问题,并报告为issue #253

答案 2 :(得分:1)

应用于简单的普通旧数据变量的

const表示该变量在该上下文中不会更改 - 因此您无法将其重新分配给某些内容。因此,您必须对其进行初始化,否则它将永久未初始化,因此无用。

答案 3 :(得分:1)

我认为还有更多选择。你可以做到

const foo f={};

const foo f(());

Const意味着您以后无法分配它,因此您必须初始化它。由于您没有定义默认构造函数,因此编译器假定它必须由您初始化。 std :: string具有默认构造函数,因此编译器会隐式调用它。