Effective C++ 0 導讀
術語(Terminology)
1.聲明式(declaration):告訴編譯器某個東西的名稱和類型。忽略其中的細節。
extern int x; // object 聲明式
std::size_t numDigits(int number); // 函數(function)聲明式
class Widget; //類聲明式
template <typename T> //模版(template) 聲明式
class GraphNode;
其中size_t只是一個typedef,是c++計算個數時的某種不帶正負號(unsigned)的類型。
2.定義式(definition):提供編譯器一些聲明式所遺漏的細節。對對象而言定義式爲編譯器爲此對象撥發內存的地點。
int x;
std::size_t numDigits(int number){
std::size_t digitsSoFar = 1;
while ((number/=10)!=0) ++digitsSoFar;
return digitsSoFar;
}
class Widget{
public:
Widget();
~Widget();
};
template <typename T>
class GraphNode{
GraphNode();
~GraphNode();
};
3.explicit 聲明構造函數
explicit 聲明構造函數可以防止被執行隱式類型轉換(implicit type conversions),但是仍然可以用來顯式類型轉換。
class B{
public:
explicit B(int x = 0,bool b = true);
};
被聲明爲explicit的構造函數通常比其non-explici更好。因爲禁止編譯器執行非預期的類型轉換。
4.copy 構造函數
copy構造函數用來“以同類型對象初始化自我對象”,通俗的說就是複製一份。具體實現如下:
class Widget{
public:
int id;
Widget(int id);
public:
Widget();
~Widget();
Widget(const Widget& rhs);
Widget& operator=(const Widget &rhs);
void printWidget();
};
Widget::Widget() {
}
Widget::~Widget() {
}
Widget::Widget(int id) : id(id) {}
Widget::Widget(const Widget &rhs):id(rhs.id) { //copy構造
}
Widget &Widget::operator=(const Widget &rhs) { //copy assignment 操作符
id = rhs.id;
return *this;
}
copy構造函數是一個重要的函數,它定義了一個對象如何passed by value.
通常來說以by value 傳遞用戶自定義類型通常不是很好的選擇,pass by reference to const 是更好的選擇。
5.其他
命名習慣方面 lhs 與 rhs 爲二元操作符(binary operators)
TR1 (Technical Report 1) 是一份規範,描述加入c++標準程序庫的諸多新機能。
Boost開源庫。
附錄
此後會寫一系列相關的c++學習專欄。推薦書籍《stl源碼刨析》 《Effective c++》等等。
相關代碼同步 github
歡迎關注互相交流學習。