首先明確一點:初始化和賦值是兩個不同的概念
看下面的**
#include#includeusing namespace std;
class test
test(int _a, int _b,int _c) :a(_a), b(_b)//這是初始化列表,是真正的初始化
private:
int a;
int b;
const int c;
};void main()
這段**可以明確的告訴我們,初始化列表是真正的初始化,因為const的變數必須賦初值,而如果把初始化的過程寫在裡面的話
其實這並不是初始化,而是賦值。
看下面的**
#include#include#includeusing namespace std;
class test
test(string _s)
private:
string s;
};void main()
如果我們沒有使用初始化列表,那麼資料成員將在建構函式函式體之前執行預設初始化
,例如上面的**輸出的是空串,這是string的預設初始化。或者我們可以自己寫乙個類
來看看效果。看下面的**
#include#include#includeusing namespace std;
class mystring//只是用做實驗的類,切記不要這樣寫
private:
char *p;
};class test
test(string _s)
private:
mystring s;
};void main()
你可以自己寫兩個類進行實驗,這段**列印的結果是「helloword」。
下面引用c++primer的一段話
在很多類中,初始化和賦值的區別事關底層效率的,乙個是直接初始化,
而另外乙個卻是先初始化後賦值。而且不單單是效率問題,一些資料成員必須
初始化,而不是賦值,所以建議使用初始化列表。
c 初始化列表
與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。struct foo 初始化列表 建構函式的兩個執行階段 從概念上來講,建構函式的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先於計算階段 初始化階段 所有...
C 初始化列表
與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。在c 中,struct和class的唯一區別是預設的克訪問性不同,而這裡我們不考慮訪問性的問題,所以下面的 都以struct來演示。struct foo 初始化列表 ...
C 初始化列表
與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。struct foo 初始化列表 建構函式的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先於計算階段。所有類型別 class type 的成員都會在初始化階...