声明一个类的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
缺less什么?
我意识到这里有三个问题,这是一个糟糕的forms,但我希望有人能够在一个答案中为我解决这个问题。
编辑:请随时closures它,如果它是愚蠢的…
你的类是POD (本质上是因为它没有提供默认的构造函数)。 声明后,PODvariables不会被初始化。 就是这样的:
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;
代码编译。
在空class的情况下提出一个错误是一个已知的问题,并报告为问题#253 。
const
,应用于一个简单的普通旧数据variables,表明该variables不会在该上下文中发生变化 – 因此您将无法将其重新分配给某些内容。 因此,您必须对其进行初始化,否则它将永远处于未初始化状态,因此无用。
我觉得还有更多的select。 你可以做
const foo f={};
要么
const foo f(());
Const意味着你以后不能分配,所以你必须初始化它。 由于你没有定义默认的构造函数,因此编译器假定它必须由你初始化。 std :: string有默认的构造函数,所以它被编译器隐式地调用。