1、建構函式初始化式只在建構函式的定義中而不是聲明中指定。
2、從概念上講,可以認為建構函式分兩個階段執行:(1)初始化階段;(2)
普通的計算階段。計算階段由建構函式函數體中的所有語句組成。不管成員是否在建構函式初始化列表中顯式初始化,類類型的資料成員總是在初始化階段初始化。初始化發生在計算階段開始之前。
3、使用建構函式初始化列表的版本初始化資料成員,沒有定義初始化列表的建構函式版本在建構函式函數體中對資料成員賦值。
4、沒有預設建構函式的類類型的成員,以及 const 或參考型別的成員,不管是哪種類型,都必須在建構函式初始化列表中進行初始化。
5、內建類型的成員不進行隱式初始化,對非類類型的資料成員進行賦值或使用初始化式在結果和效能上都是等價的。
6、成員被初始化的次序就是定義成員的次序。
7、按照與成員聲明一致的次序編寫建構函式初始化列表是個好主意。此外,儘可能避免使用成員來初始化其他成員。
8、初始化式可以是任意運算式。
9、我們更喜歡使用預設實參,因為它減少代碼重複。
樣本
#include "iostream"using namespace std;class Sales_item {public://default argument for book is the empty stringSales_item(const std::string &book = ""): isbn(book), units_sold(0), revenue(0.0) { } Sales_item(std::istream &is); // as beforeprivate:string isbn;int units_sold;int revenue;};int main(){Sales_item empty;Sales_item Primer_3rd_Ed("0-201-82470-1");return 1;}
10、只有當一個類沒有定義建構函式時,編譯器才會自動產生一個預設建構函式。通常,在預設建構函式中給成員提供的初始值應該指出該對象是“空”的。
11、如何使用預設建構函式?
樣本
Sales_item myobj();// oops! declares a function, not an object//the following are right.Sales_item myobj; //defines a class object ...Sales_item myobj = Sales_item() //ok,create an unnamed, empty Sales_itemand use to initialize myobj
12、隱式類型轉換
樣本
class Salse_item{publi:Salse_item(const std::string &book = ""):isbn(book)...{}Salse_item(std::iostream &is);//explicit Salse_item(std::iostream &is);...bool same_isbn(Salse_item &si){...}};int main(){Salse_item item;string null_book = "12345";item.same_isbn(null_book); //會發生自動轉換,把string類型轉換成Salse_item型。item.same_isbn(cin); ////會發生自動轉換,把cin流類型轉換成Salse_item型。//item.same_isbn(Salse_item(null_book)); //顯式的進行轉換}
如上例中所示,我們構造了一個測試完成後被丟棄的對象,這個行為幾乎是一個錯誤。
1)抑制由轉換建構函式定義的隱式轉換
聲明為explicit,來停止隱式轉換的上下文中使用建構函式。
2)如果真的需要轉換,則顯式的進行。
通常,除非有明顯的理由想要定義隱式轉換,否則,單形參建構函式應該為 explicit。
參考
[1] http://blog.163.com/zhoumhan_0351/blog/static/3995422720100250413207/
[2] http://blog.163.com/zhoumhan_0351/blog/static/39954227201032845132592/
[3] http://blog.163.com/zhoumhan_0351/blog/static/399542272010318112048522/
[4] http://blog.163.com/zhoumhan_0351/blog/static/39954227201032092854732/
[5] http://blog.163.com/zhoumhan_0351/blog/static/3995422720100284731826/