我有一个自定义类,我想表现得像内置类型。
但是我注意到你可以在不提供初始值的情况下初始化该类的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 ++大师的任何想法?
答案 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.a
和y.b
现在“故意留空”。
但除非您的类没有任何用户定义的构造函数,否则此信息对您没有帮助。您不能将初始化类型“转发”给成员(例如 )。Foo() : INIT_SAME_AS_SELF(a), b() { }