为什么ISO C ++标准禁止成员初始化?

时间:2012-10-06 06:53:24

标签: c++ initialization standards

为什么我不能那样做

class A {
  public:

    int x = 10;

  ...
};

我必须这样做吗?

class A {
  public:

    int x;

  A(){
    x = 10;
    ...
  }

  ...
};

这是因为C ++试图比C这样的语言更安全?还有其他原因吗?

3 个答案:

答案 0 :(得分:5)

这与类型安全无关,两个例子都是安全的。

创建语言时,您需要定义允许的内容和不允许的内容。由于编写黑名单是一种永无止境的体验,因此语言通常以白名单的方式编写,增加了越来越多可能的东西。

但是,如果没有明确权衡后果,就不应允许事情发生。每当你想要允许新的东西时,你需要检查:

  • 易于实施
  • 与其他现有功能和已知可能扩展的交互

此外,它还意味着有更多的人可以学习那些希望使用该语言的人。

然而,你在这里要求的是相对容易的。对于类,它可以被视为函数默认参数的对应物。这已在C ++ 11中采用,因为它是在编写多个构造函数时保证默认值一致性的最简单方法。

就个人而言,在使用C ++ 11时,我建议以这种方式初始化所有内置类型(如果只是0),就像我建议在声明局部变量时初始化它们一样:这样你就不会忘记在其中一个构造函数中初始化它们。

答案 1 :(得分:3)

警告:推测如下。

C ++类基于C结构,具有许多附加功能。 C结构的成员不能有初始化器(因为每次创建结构类型的对象时都需要执行代码,这对于早期的C编译器来说太复杂了。)

早期C ++(最初称为“C with Classes”)添加了构造函数,这种机制确实需要在每次创建给定类型的对象时执行代码。由于构造函数可以执行成员初始化程序可以执行的所有操作,因此成员初始化程序可能被视为不必要。

但正如你所暗示的那样,即使不是绝对必要的,也可以方便使用成员初始化程序。新的2011 ISO C ++标准已将该功能添加到该语言中,因此显然ISO C ++委员会同意这是一个好主意。此功能增加了语言的复杂性(例如,必须有新的规则来管理初始化程序和构造函数的执行顺序,依赖于该顺序的代码可能会造成混淆)。委员会认为便利性增加了复杂性。 (我认为我同意。)

(C ++语言的发明者Bjarne Stroustrup有一本书,“The Design and Evolution of C++”,讨论了他早期的设计决策。我还没有检查它是否提到这个特定的问题。)

摘要:成员初始化程序方便但不是必要,只需要一段时间就可以决定将它们添加为语言功能。

答案 2 :(得分:2)

AFAIK,简洁的语言。

语言紧凑有一定的价值。不用你的第一个例子,语言没有任何严重的限制,对吧?因此,您拥有更薄的书籍,更简单的编译器。这些优点值得商榷。请不要将它们视为适当的东西。我个人认为紧凑的价值。 C的卓越成功部分归功于其简洁性和紧凑性。

随着C ++ 11的引入,情况正在向越来越少的人知道语言significantly deep的方向发展。 WILL 会产生负面影响。我并没有说明只是消极的。