为什么我们不能在其声明中初始化类成员?(Why can't we initialize cl

2019-07-21 19:11发布

我不知道是否有一个原因,我们不能在他们的声明中初始化成员。

class Foo
{
    int Bar = 42; // this is invalid
};

作为使用构造函数初始化列表的等效。

class Foo
{
    int Bar;
public:
    Foo() : Bar(42) {}
}

我个人的理解是,上面的例子是更富于表现力和故意的。 此外,这是一个更短的语法。 而且我没有看到混乱与其他语言元素的任何可能性。

有没有这方面有任何官方澄清?

Answer 1:

非静态成员的初始化不能像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在该提出了非静态成员初始化时需要考虑的问题的详尽说明。



Answer 2:

主要的原因是,初始化适用于一个对象或实例,并在类的声明中没有对象或实例; 你没有那个,直到你开始建设。

有许多人在这方面的一些变化。 目前,在C ++ 98的标准化的最后,该委员会加入到整型的静态常量成员做到这一点的可能性---这主要是因为这些都可以在上下文中使用,其中编译器必须能够看到初始化。 在C ++ 11,语言已经扩展到允许指定在声明中初始化,但是这仅仅是一个速记,实际的初始化还是发生在构造函数的顶部。



Answer 3:

当两个或多个对象(类的实例)被声明,这些对象共享这些数据成员。 所以值可以用构造的帮助下进行初始化。 所以在申报不能初始化类成员。



文章来源: Why can't we initialize class members at their declaration?