在定義模板類後,會面臨如何對模板資料成員變數進行初始化,對於用途十分明確的模板類,可以根據用途直接定義初始化的型別。但對於通用模板類,成員變數的型別可能是基本型別,也可能是復合型別,所以需要使用通用的初始化手段。在c++中可以使用初始化列表對任何型別進行初始化,不論是基本型別還是復合型別。
// 值初始化,例如
std::string s
;// 直接初始化,例如
std::string s
("hello");
// 複製初始化,例如
std::string s =
"hello"
;// 列表初始化,例如
std::string s
;// 聚合初始化,例如
char a[3]
=;// 引用初始化,例如
char
& c = a[0]
;
那麼對於以上幾種初始化的方式,建構函式的初始化列表中應該如何去寫呢?
// 方式1:
// 這樣寫?
template
<
class
t>
class
class
)private
: t a;
};
// 方式2:
// 這樣寫?
template
<
class
t>
class
class
private
: t a;
};
使用方式1對基本型別進行初始化時,會有這樣的錯誤:cannot initialize non-class type 'int' with a parenthesized initializer list
,意思是說不能使用帶括號的初始化列表初始化非類型別int。因為基本型別沒有建構函式,所以就辦法通過列表初始化。只能通過值初始化。
正確的做法應該採用方式2,因為不論是基本型別還是類型別,都可以通過值初始化的方式進行初始化。
在定義模板類後,會面臨如何對模板資料成員變數進行初始化,對於用途十分明確的模板類,可以根據用途直接定義初始化的型別。但對於通用模板類,成員變數的型別可能是基本型別,也可能是復合型別,所以需要使用通用的初始化手段。在c++中可以使用初始化列表對任何型別進行初始化,不論是基本型別還是復合型別。
// 值初始化,例如
std::string s
;// 直接初始化,例如
std::string s
("hello");
// 複製初始化,例如
std::string s =
"hello"
;// 列表初始化,例如
std::string s
;// 聚合初始化,例如
char a[3]
=;// 引用初始化,例如
char
& c = a[0]
;
那麼對於以上幾種初始化的方式,建構函式的初始化列表中應該如何去寫呢?
// 方式1:
// 這樣寫?
template
<
class
t>
class
class
)private
: t a;
};
// 方式2:
// 這樣寫?
template
<
class
t>
class
class
private
: t a;
};
使用方式1對基本型別進行初始化時,會有這樣的錯誤:cannot initialize non-class type 'int' with a parenthesized initializer list
,意思是說不能使用帶括號的初始化列表初始化非類型別int。因為基本型別沒有建構函式,所以就辦法通過列表初始化。只能通過值初始化。
正確的做法應該採用方式2,因為不論是基本型別還是類型別,都可以通過值初始化的方式進行初始化。
初始化列表成員變數的初始化
對於以下程式 include using namespace std class base base b 0 a b int get a int get b int main 本想得到的結果是a,b都為90。但是實際結果卻是 4273046 90process returned 0 0x0 exec...
c 成員變數初始化
include include using namespace std classa a a intmain 類a的成員變數將進行預設初始化 c 11新特性允許為資料成員提供類內初始值 include include using namespace std classa a a intmain a....
類成員變數初始化
在 c 中,類的成員變數未初始化問題,取決於物件建立方式,不同的建立方式,直接導致類成員變數的初值不同。本文通過下例,得出一下結論 1.在函式體內置立乙個物件,類成員變數和普通的區域性變數一樣,是乙個隨機值。2.建立乙個全域性成員物件,類成員變數和全域性變數一樣,編譯器賦值為 0。3.在函式體內 n...