21.C++- ++操作符重載、隱式轉換之explicit關鍵字、類的類型轉換函數
阿新 • • 發佈:2018-09-19
inf 我們 bug 操作符 臨時對象 blog 返回值 cnblogs 文章 ,所以便將-2隱式轉換為unsigned int,從而造成結果不同.
++操作符重載
- ++操作符分為前置++和後置++,比如: ++a; a++;
- ++操作符可以進行全局函數或成員函數重載
- 重載前置++操作符不需要參數
- 重載後置++操作符需要一個int類型的占位參數
- 前置++操作符的返回值為*this
- 後置++操作符的返回值為臨時對象
例如:
轉換規則如下所示:
比如:
隱式轉換的隱患
隱式轉換有時會因為類型不同,得到的結果大有不同,也是常見bug之一.
參考以下示例:
運行打印:
答案並非是-1000。
同樣,我們使用構造函數時,也經常使用隱式轉換
參考以下示例:
運行打印:
首先編譯器通過-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關鍵字、類的類型轉換函數