More Effective C++ - 章節二 : 操做符(operators)

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

相關文章
相關標籤/搜索