「就地」宣告
c++98中,支援在類宣告的時候使用等號"="初始化類中靜態成員變數,這種宣告方式我們稱之為「就地」宣告。
但是,c++98要求靜態成員必須滿足常量性,而且型別必須是整型或者列舉型,而非靜態成員變數的初始化則必須在建構函式中進行。
如下示例:
1class
init
26 init(int
d) : a(d) 7{}
8private:9
inta;
10const
static
int b = 0;11
int c = 1; //
成員,無法通過編譯
12static
int d = 0; //
成員,無法通過編譯
13static
const
double e = 1.3; //
非整型或者列舉型,無法通過編譯
14static
const
char* const f = "
e"; //
非整型或者列舉型,無法通過編譯
15 };
如上各種情況均無法通過編譯。
c++11中的區別
在c++11中,允許使用 等號=
或者 花括號{}
進行就地的非靜態成員變數初始化。如下示例:
1structc 2
;56intc;7
intd;8};
910struct
init11;
14 c c;
15 };
從第12、13、14行可以看到,使用等號或花括號進行就地初始化。
如此使用後的注意事項:
[1] 初始化列表的效果總是優先於就地初始化。如下示例:
1 #include 2using
namespace
std;34
struct
test5;
7 test(int
i) : c(i)
8{};910
int c = 2;11
};12
13int
main()
14
[2] 對於非常量的靜態成員變數,c++11與c++98保持一致:
仍然還是要在標頭檔案以外的位置定義它,這會保證編譯時,類靜態成員的定義最後只存在於乙個目標檔案中。
如下示例:
1//正確情況:
2structs3
;5 s(int
i) : s(i) {};67
int s = 2;8
static
intp;9};
1011
int s::p = 3;12
13//
錯誤情況:
14structc15
;17 c(int
i) : c(i) {};
1819
int c = 2;20
static
int d = 3; //
報錯 non-const static data member must be initialized out of line
21 };
[3] 相對於傳統的初始化列表,在類宣告中對非靜態成員變數進行就地列表初始化可以降低程式設計師的工作量。
當然,我們只在有多個建構函式,且有多個多個成員變數的時候可以看到新方式帶來的便利。如下示例:
1 #include2using
namespace
std; 34
class
mem 59
10private
: 11
intm;
12};
1314
class
group
15 //
這裡就不需要初始化data、mem、name成員了
18 group(int a) : data(a) {} //
這裡就不需要初始化mem、name成員了
19 group(mem m) : mem(m) {} //
這裡就不需要初始化data、name成員了
20 group(int a, mem m, string
n) : data(a), mem(m), name(n)
21{}
2223
private
: 24
int data = 1
; 25 mem mem;
26string name;
27 };
good good study, day day up.
順序 選擇 迴圈 總結
C 初始化成員列表
c 在類的建構函式中,可以兩種方式初始化成員資料 data member 1,在建構函式的實現中,初始類的成員資料。諸如 class point int getx int gety 2,還可以定義初始化成員列表 initializer list 來初始化成員資料 data member 改寫建構函式...
從彙編看c 初始化列表初始化成員變數
簡略來說,編譯器會對初始化列表按照成員變數的宣告順序重新一一排序,安插到建構函式中進行初始化操作,而且這些初始化操作在建構函式裡面使用者自己定義的任何 之前。下面是c 原始碼 class x intmain 下面是main函式裡面的彙編碼 13 int main xoreax,eax movesp,...
建構函式初始化成員變數問題
請問在建構函式中使用初始化清單和直接在建構函式內初始化成員變數有什麼區別?比如 construct function var1 1 var2 2 var 3 和 construct function 有沒有什麼本質區別?construct function var1 1 var2 2 var 3 初...