閱讀758 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C++編程規範之29:考慮重載,以避免隱式類型轉換

摘要:

    如無必要勿增對象:因素類型轉換提供了語法上的便利。但是如果創建臨時對象的工作並不不要而且適於優化,那麼可以提供簽名與常見參數類型精確匹配的重載函數,而且不會導致轉換。

隱式轉換最常見的例子是字符串的比較,見如下程序:

class string
{
         //......
         String(const char* text);
};
booloperator==(const String&, const String&);
//......代碼中的某處......
if (something =="Hello")
{
         ......
}


 

    上述代碼中,編譯器將進行比較操作,但是“==”操作符的兩邊都是conststring,這時就會進行隱式轉換,從char*隱式轉換到string。這樣會對程序的性能造成很大的影響,隱式轉換操作會複製字符,但是我們隻是比較,沒有必要複製。

這一個問題的解決方法是:定義重載以避免轉換。

booloperator==(const String& lhs, const String& rhs);
booloperator==(const String& lhs, const char* rhs);
booloperator==(const char* lhs, const String& rhs);


    這樣看起來會有重複代碼,但是這隻是“簽名重複”而已,因為所有三個重載通常都使用相同的後端函數。這樣的簡單重載,使你不可能掉入不成熟的優化的陷阱,而且提供它們隻是小菜一碟,尤其是在設計程序庫的時候,這時想要提前預測在性能敏感的代碼中將出現哪些常見類型是很困難的。

最後更新:2017-04-03 12:53:54

  上一篇:go Java反射機製--Class類
  下一篇:go SVN報錯:could not connect to server