1. 程式人生 > >章節二 : 操作符(operators)

章節二 : 操作符(operators)

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