c++能不能给类的成员变量在声明的时候初始化?
能。可能早先的版本不能,但是c++11标准下能。有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化,如下代码:(另外初始化列表中初始化的顺序是和变量声明的顺序一样,而与列表中的顺序无关)
1 1 #include "stdafx.h" 2 2 #include <iostream> 3 3 using namespace std; 4 4 class A 5 5 { 6 6 public: 7 7 int a = 1; 8 8 A() {} 9 9 A(int a_):a(a_){} 10 10 A(int a_, bool b) :a(4) { a = a_; } 11 11 }; 12 12 13 13 int main() 14 14 { 15 15 A a1, a2(3), a3(5, true); 16 16 cout << "a1.a=" << a1.a << endl; 17 17 cout << "a2.a=" << a2.a << endl; 18 18 cout << "a3.a=" << a3.a << endl; 19 19 system("pause"); 20 20 return 0; 21 21 }
结果如图,可看出,初始化列表初始化的变量值会覆盖掉声明时初始化的值,而构造函数中初始化的值又会覆盖掉初始化列表的,足以看出初始化的顺序:
另外有人说这种初始化方式破坏了类的抽象性。是的,一定程度上,但是却能带来很大便捷。好比一台机器能够生产某种零件,零件的各个尺寸可以在一定程度任意改变,但是我们并不是每次生产这种零件都需要一个一个地给定每一个参数,然后再生产,机器会自己带有一套“默认”的零件尺寸参数,这样新手可以直接用默认参数生产,除非你知道每一个参数都是干啥的,否则没必要更改。那么也可以在构造函数中给出这一套“默认参数”啊,是的,但是假如你有10个构造函数,那么你每一个都要复制一次所有成员变量的默认参数吗?显然在做重复的无用工作,那么为什么不直接在声明的时候就初始化!