为什么我不能那样做
class A {
public:
int x = 10;
...
};
我必须这样做吗?
class A {
public:
int x;
A(){
x = 10;
...
}
...
};
这是因为 C++ 试图比 C 之类的语言更安全?还有其他原因吗?
为什么我不能那样做
class A {
public:
int x = 10;
...
};
我必须这样做吗?
class A {
public:
int x;
A(){
x = 10;
...
}
...
};
这是因为 C++ 试图比 C 之类的语言更安全?还有其他原因吗?
这与类型安全无关,两个例子都是安全的。
创建语言时,您需要定义什么是允许的,什么是不允许的。由于编写黑名单将是永无止境的体验,因此通常以白名单的方式编写语言,添加越来越多的可能事物。
但是,不应该在没有明确权衡后果的情况下允许事情发生。每当你想允许新的东西时,你需要检查:
此外,这也意味着对于那些希望使用该语言的人来说,还有更多的东西需要学习。
但是,您在这里要求的是相对容易的。对于类,它可以看作是函数默认参数的对应物。这已在 C++11 中采用,因为它是在编写多个构造函数时保证默认值一致性的最简单方法。
就个人而言,在使用 C++11 时,我建议以这种方式初始化所有内置类型(如果只是0
),就像我建议在声明局部变量时初始化它们一样:这样你就不会忘记在其中一个构造函数中初始化它们。
警告:猜测如下。
C++ 类基于 C 结构,具有许多附加特性。C 结构的成员不能有初始化程序(因为每次创建结构类型的对象时都需要执行代码,这对于早期的 C 编译器来说太复杂了)。
早期的 C++(最初称为“C with Classes”)添加了构造函数,这种机制确实需要在每次创建给定类型的对象时执行代码。由于构造函数可以做成员初始化器可以做的所有事情,因此成员初始化器可能被认为是不必要的。
但是正如您在问题中所暗示的那样,拥有成员初始化程序会很方便,即使它不是绝对必要的。并且新的 2011 ISO C++ 标准已将该功能添加到该语言中,因此显然 ISO C++ 委员会同意这是一个好主意。这个特性增加了语言的复杂性(例如,必须有新的规则来管理初始化器和构造器的执行顺序,并且依赖于该顺序的代码可能会造成混乱)。委员会认为便利值得增加复杂性。(我想我同意。)
(Bjarne Stroustrup,C++ 语言的发明者,有一本书,“ C++ 的设计和演变”,讨论了他早期的设计决策。我还没有(还)检查过他是否提到了这个特定的问题。)
总结:成员初始化器很方便但不是必需的,只是花了一段时间才决定将它们添加为语言特性。
AFAIK,语言的纯粹简单性。
使语言紧凑有一定的价值。不允许您的第一个示例,该语言没有构成任何严重的限制,对吗?结果你的书更薄,编译器更简单。这些优势值得商榷。请不要认为它们是正确的。我个人认为紧凑的价值。C语言的非凡成功可以部分归功于它的简单性和紧凑性。
随着 C++11 的引入,情况正朝着越来越少的人了解该语言的方向发展significantly deep
。这将产生负面影响。我并不是说这只是消极的。