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操作符,以及析構函數。