为什么我们不能在他们的声明中初始化班级成员?

时间:2013-03-16 16:42:16

标签: c++ class constructor initialization member

我想知道我们是否有理由不能在声明中初始化会员。

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

相当于使用构造函数初始化列表。

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

我个人的理解是,上面的例子更具表现力和意图。此外,这是一种较短的语法。我认为没有任何可能与其他语言元素混淆。

对此有任何官方澄清吗?

3 个答案:

答案 0 :(得分:22)

在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)。

使用添加的功能,这不是问题,因为您无法使用此parantheses语法初始化成员。您必须使用大括号或等于初始化程序,例如:

int i = x;
int i{x};

这些只能是数据成员,因此我们不再有任何问题。

请参阅提案N2628,以便更全面地了解在提出非静态成员初始值设定项时必须考虑的问题。

答案 1 :(得分:5)

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

在这方面有一些进展。已经,在 委员会补充说,在C ++ 98标准化的最后阶段 为整数的静态const成员执行此操作的可能性 类型---主要是因为这些可以在上下文中使用 编译器必须能够看到初始化。在C ++ 11中, 语言已扩展为允许在中指定初始值设定项 声明,但这只是一个简写 - 实际 初始化仍然发生在构造函数的顶部。

答案 2 :(得分:-1)

声明两个或更多对象(类的实例)时,这些对象共享这些数据成员。因此可以在构造函数的帮助下初始化value。所以我们不能在声明期间初始化类成员。