章節二 : 操作符(operators)
阿新 • • 發佈:2018-12-12
5. 對定製的 "型別轉換函式" 保持警覺
允許編譯器執行隱式型別轉換,害處多過好處,不要提供轉換函式,除非你確定需要。
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* .
class foo { foo(int a = 0, int b = 1); double asDouble() const; // 新增一個成員函式做轉換 ... };
2.使用 explicit 關鍵字 .
3.使用代理物件,也就是類中再加一個代理類做.
6. 區別 increment/decrement 操作符的前置(prefix)和後置(postfix)形式
看一下前置和後置過載例子:
class foo{
public:
foo& operator++();
const foo operator++(int);
foo& operator--();
const foo operator--(int);
};
為了防止 "i++++" 情況出現,後置式返回了一個const物件。 因此,正常情況下我們應該使用前置式,直接返回引用,而不是臨時拷貝物件,效率會更高。
7. 千萬不要過載&&,||和, 操作符
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