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

axi*_*xis 4 c++ standards initialization

为什么我不能那样做

class A {
  public:

    int x = 10;

  ...
};
Run Code Online (Sandbox Code Playgroud)

我必须那样做?

class A {
  public:

    int x;

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

  ...
};
Run Code Online (Sandbox Code Playgroud)

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

Mat*_* M. 5

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

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

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

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

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

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

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