Effective C++讀書筆記之五:瞭解C++默默編寫並調用哪些函數

Item 05:Know what functions C++ silently writes and calls

如果你寫下:
class Empty{ };

這就好像你寫下這樣的代碼:

class Empty
{
public:
	Empty(){...}//默認構造函數
	Empty(const Empty& rhs){...}//拷貝構造函數
	~Empty(){...} 
	
	Empty& operator=(const Empty& rhs){...}//copy assignment操作符 
}; 

在某些情況下,如果你沒有聲明一個copy assignment操作符,編譯器也會拒絕爲你的class生出operator=,見下例:

template<class T>
class NameObject;
{
public:
	NameObject(std::string&name,const T& value);
	...//假設並未聲明operator=
private:
	std::string& nameValue;//注意這是一個reference
	const T objectValue;//注意這是一個const 
};

std::string newDog("Persephone");
std::string oldDog("Satch");
NameObject<int> p(newDog,2);

NameObject<int> s(oldDog,36);

p=s;
//在這種情況下,C++的響應是拒絕編譯那一行的賦值動作

還有最後一種情況:如果某個base classes將copy assignment操作符聲明爲private,編譯器將拒絕爲其derived classes生成一個copy assignment操作符。

//雲風評註:到底是直接引用,還是對值引用,在C++中是一個讓人糾結的問題。對一個對象的引用,又分指針引用和使用C++引入的引用類型。爲了追求理論上的性能極限,C++把如何讓實現這種細節性的問題留給了程序員來決定。
我們最終只好根據慣例來做出選擇。比如在向函數傳遞一個字符串的時候,資深的C++程序員,不需多想就會把參數聲明爲const std::string &,而不會選擇傳遞string的值對象//

請記住:

編譯器可以暗自爲class創建default構造函數、copy構造函數、copy assignment操作符,以及析構函數。


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