1. 程式人生 > >21.C++- ++操作符重載、隱式轉換之explicit關鍵字、類的類型轉換函數

21.C++- ++操作符重載、隱式轉換之explicit關鍵字、類的類型轉換函數

inf 我們 bug 操作符 臨時對象 blog 返回值 cnblogs 文章

++操作符重載

  • ++操作符分為前置++後置++,比如: ++a; a++;
  • ++操作符可以進行全局函數成員函數重載
  • 重載前置++操作符不需要參數
  • 重載後置++操作符需要一個int類型的占位參數
  • 前置++操作符的返回值為*this
  • 後置++操作符的返回值為臨時對象

例如:

轉換規則如下所示:

技術分享圖片

比如:

隱式轉換的隱患

隱式轉換有時會因為類型不同,得到的結果大有不同,也是常見bug之一.

參考以下示例:

運行打印:

答案並非是-1000。

同樣,我們使用構造函數時,也經常使用隱式轉換

參考以下示例:

運行打印:

首先編譯器通過-2來找只有一個參數的構造函數,發現它的參數是unsigned int

,所以便將-2隱式轉換為unsigned int,從而造成結果不同.

如何解決隱式轉換

在構造函數聲明的時候加上explicit關鍵字,便能使該函數只能進行顯示轉換,使用方法如下:

添加後,再次編譯Test t1=-2;時,就會報錯了.

若添加explicit後,還想繼續使用隱式轉換,可以通過下面3鐘方法使用隱式轉換:

同樣,也能支持類與類之間轉換

不過類型轉換函數可能會與構造函數沖突,比如:

編譯出錯,編譯器不知道用哪個方式去初始化val對象,因為Value Val=t可以等價於:

explicit關鍵字.

註意:在工程中,一般都是通過 to Type()成員函數來代替類的類型轉換函數,比如QT的Qstring類: 有toInt()、toDouble()等成員函數來實現類型轉換


文章來源:https://www.cnblogs.com/lifexy/p/8665780.html

21.C++- ++操作符重載、隱式轉換之explicit關鍵字、類的類型轉換函數