如何防止使用类类型的const变量的默认初始化

时间:2011-11-18 12:19:52

标签: c++ initialization const initializer default-constructor

我有一个自定义类,我想表现得像内置类型。

但是我注意到你可以在不提供初始值的情况下初始化该类的const变量。我的类目前有一个空的默认构造函数。

这是int和我的类foo的比较:

int a;              // Valid
int a = 1;          // Valid
const int a = 1;    // Valid
const int a;        // Error

foo a;              // Valid
foo a = 1;          // Valid
const foo a = 1;    // Valid
const foo a;        // Should cause an error, but it compiles

如你所见,我需要预防

const foo a;

来自编译。

来自C ++大师的任何想法?

2 个答案:

答案 0 :(得分:6)

只有当它有一个默认构造函数时才会编译,并且它会编译,因为它有它,这意味着它已被初始化。如果您不想编译该行,只需禁用默认构造函数(也会使foo a;错误成为不必要的副作用)。如果没有foo的定义或你想做什么,这就是我能得到的。

我认为没有任何方法可以实现你想要的东西(即允许非const变量默认初始化,而const版本失败编译并允许其他用例 - 需要提供构造函数)

答案 1 :(得分:3)

C ++的规则只是说默认初始化(例如new T;)和值初始化(例如new T();)对于类类型的对象是相同的,但对于基本类型的对象则不相同。

你无能为力“超越”这种区别。这是语法的基本部分。如果您的类是可初始值化的,那么它也可以默认初始化。

没有任何用户定义的构造函数的类有一种异常:在这种情况下,成员的初始化是递归完成的(所以如果你默认初始化对象,它会尝试默认初始化所有成员),并且如果任何类成员本身是基本的,或者再次具有这种性质,那么这将失败。

例如,请考虑以下两个类:

struct Foo { int a; int b; };
struct Goo { int a; int b; Goo(){} };

//const Foo x; // error
const Goo y;   // OK

Foo的隐式构造函数被拒绝,因为它没有初始化基本成员。不过,y很乐意默认初始化,y.ay.b现在“故意留空”。

但除非您的类没有任何用户定义的构造函数,否则此信息对您没有帮助。您不能将初始化类型“转发”给成员(例如 Foo() : INIT_SAME_AS_SELF(a), b() { } )。