我不知道是否有一个原因,我们不能在他们的声明中初始化成员。
class Foo
{
int Bar = 42; // this is invalid
};
作为使用构造函数初始化列表的等效。
class Foo
{
int Bar;
public:
Foo() : Bar(42) {}
}
我个人的理解是,上面的例子是更富于表现力和故意的。 此外,这是一个更短的语法。 而且我没有看到混乱与其他语言元素的任何可能性。
有没有这方面有任何官方澄清?
我不知道是否有一个原因,我们不能在他们的声明中初始化成员。
class Foo
{
int Bar = 42; // this is invalid
};
作为使用构造函数初始化列表的等效。
class Foo
{
int Bar;
public:
Foo() : Bar(42) {}
}
我个人的理解是,上面的例子是更富于表现力和故意的。 此外,这是一个更短的语法。 而且我没有看到混乱与其他语言元素的任何可能性。
有没有这方面有任何官方澄清?
非静态成员的初始化不能像C ++在此之前11来完成。 如果你用C ++ 11编译器来编译,它应该愉快地接受你给的代码。
我想,不让它摆在首位的原因是因为数据成员声明没有一个定义。 没有引入对象。 如果你有一个数据成员,如int x;
,没有int
对象被创建,直到你真正创建类的类型的对象。 因此,这件上的初始化会产生误导。 它只有一个值可以分配给成员,而这正是成员初始化列表是施工过程中。
也有一些技术问题,以消除可能被添加的非静态成员初始化之前。 请看下面的例子:
struct S {
int i(x);
// ...
static int x;
};
struct T {
int i(x);
// ...
typedef int x;
};
当这些结构被解析时,在解析构件时i
,它是不明确它是否是一个数据成员声明(如在S
)或成员函数声明(如在T
)。
随着功能的增加,这不是一个问题,因为这个括号语法,你不能初始化成员。 您必须使用大括号或相等的初始化程序 ,例如:
int i = x;
int i{x};
这些只能是数据成员,所以我们没有任何问题了。
见提案N2628在该提出了非静态成员初始化时需要考虑的问题的详尽说明。
主要的原因是,初始化适用于一个对象或实例,并在类的声明中没有对象或实例; 你没有那个,直到你开始建设。
有许多人在这方面的一些变化。 目前,在C ++ 98的标准化的最后,该委员会加入到整型的静态常量成员做到这一点的可能性---这主要是因为这些都可以在上下文中使用,其中编译器必须能够看到初始化。 在C ++ 11,语言已经扩展到允许指定在声明中初始化,但是这仅仅是一个速记,实际的初始化还是发生在构造函数的顶部。
当两个或多个对象(类的实例)被声明,这些对象共享这些数据成员。 所以值可以用构造的帮助下进行初始化。 所以在申报不能初始化类成员。