5. 對定製的 "類型轉換函數" 保持警覺函數
容許編譯器執行隱式類型轉換,害處多過好處,不要提供轉換函數,除非你肯定須要。post
class foo { foo(int a = 0, int b = 1); operator double() const; ... }; foo test(1, 2); double d = 0.5 * test; // 編譯器會調用double進行隱式轉換
上述類型隱式轉換可能致使錯誤(非預期)的函數被調用。解決方法 1.相似於C++ string 同樣,添加一個函數專門作轉換,相似string的c_str()轉換string爲const char* .spa
``` class foo { foo(int a = 0, int b = 1); double asDouble() const; // 添加一個成員函數作轉換 ... }; ```2.使用 explicit 關鍵字 .代理
3.使用代理對象,也就是類中再加一個代理類作.code
6. 區別 increment/decrement 操做符的前置(prefix)和後置(postfix)形式對象
看一下前置和後置重載例子:內存
class foo{ public: foo& operator++(); const foo operator++(int); foo& operator--(); const foo operator--(int); };
爲了防止 "i++++" 狀況出現,後置式返回了一個const對象。 所以,正常狀況下咱們應該使用前置式,直接返回引用,而不是臨時拷貝對象,效率會更高。ci
7. 千萬不要重載&&,||和, 操做符rem
8. 瞭解各類不一樣意義的new和delete編譯器
new的主要介紹以下:
// 1.首先分配內存 2.執行構造函數 string *ps = new string("Memory Management"); // 分配內存 void* operator new(size_t size); // 在 buffer 內存處構建foo對象 new (buffer) foo(int i);
2018年10月1日15:59:02