能。可能早先的版本不能,但是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個構造函數,那么你每一個都要復制一次所有成員變量的默認參數嗎?顯然在做重復的無用工作,那么為什么不直接在聲明的時候就初始化!