为什么我不能那样做
class A {
public:
int x = 10;
...
};
我必须这样做吗?
class A {
public:
int x;
A(){
x = 10;
...
}
...
};
这是因为C ++试图比C这样的语言更安全?还有其他原因吗?
答案 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 会产生负面影响。我并没有说明只是消极的。