Effective C++ item 5

條款5 :瞭解C++默默編寫調用了那些函數

calss A{
	public:
	A() = default; //empty 類會自動創建,顯示聲明構造時,編譯器不會自動添加
	A(std::string a,std::string b){}  
	private:
	std::string aa;
	std::string bb; 
};
int main(){
	A a("abc","123"); // ok
	std::string _a = "123";
	std::string _b = "abc";
	A b(_a,_b); //ok
	A c(); //ok
}

當類中成員變量爲non-reference或者non-const時,構造函數參數接受左值和右值,函數體內可通過賦值傳給成員變量。同理copy-construct和assignment。

class A{
	public:
	A() = default;;
	A(std::string a,std::string b):aa(a),bb(b){}
	private;
	std::string & aa;
	const std::string bb;
};
int main(){
	A a("123","12345"); //ok,but a.aa  no initialization success
	-----------------------------------------------------------
	std::string a = "123";
	std::string b = "345";
	A b(a,b); // ok
	a = "qweer";
	b;//b.aa no value
}

當類中成員變量爲引用類型或const時,必須使用初始化列表進行初始化,但是構造中的參數,引用時必須傳入左值才能正確賦值否則爲空,而const變量接受左值和右值。注意的時,當使用左值傳入參數時,a的值修改之後,b中aa會爲空。
將構造函數改成:

A(std::string& a,std::string b):aa(a),bb(b){}

這樣上述問題將不不會存在,外部變量a的改變不會使得b.aa爲空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章