C 11顯示型別轉換的優點

2022-09-25 09:06:11 字數 1217 閱讀 1485

1.隱式型別轉換的問題

隱式型別轉換是c++乙個讓人又愛又恨的特性,使用方便,但可能會降低**可讀性,甚至會造成一些十分隱晦的錯誤。

#include

using namespace std;

class myint

//型別轉換操作符

operator bool() const noexcept

//加運算子過載

myint& operator+(const myint& right)

int getvalue() const

private:

int _value;

};int main()

程式編譯執行輸出:

myint1+myint2=1

雖然程式編譯執行沒有什麼問題,但是兩個myint物件相加的結果並不是我們期望的數值3,而是1,導致這種隱晦錯誤的原因是在兩個myint物件相加後,結果物件myint1被隱式地轉換為bool型別,導致輸出數值為1。隨著專案**規模變大,這種由隱式型別轉換導致的隱晦錯誤會越埋越深,越來越難以發現。

2.顯示型別轉換

為了阻止容易導致隱晦錯誤的隱式型別轉換,c++11引入了explicit關鍵字作用於自定義的型別轉換操作符的功能,禁止隱式型別轉換。其用法類似於explicit作用於單參建構函式來避免單引數建構函式被隱式呼叫造成的隱式型別轉換。

//型別轉換操作符

explicit operator bool() const noexcept

cout << "myint1+myint2=" << myint1 + myint2 << endl; //編譯出錯

當使用explicit關www.cppcns.com鍵字修飾bool型別轉換操作符時,隱式型別轉換將會被阻止,進而引起上面的編譯錯誤,將潛在的隱vvpmhreup晦錯誤暴露於編譯階段,讓錯誤得以提前發現,提前解決。

注意,顯式型別轉換有乙個例外。如果表示式被用作條件,vvpmhreup僅限轉換到bool,那麼顯式的operator bool()也可以隱式地進行。「被用作條件」指出現在以下語句:

(1)if、while及do語句的條件部分;

(程式設計客棧2)for語句頭的條件表示式;

(3)邏輯非運算子(!)、邏輯或運算子(||)、邏輯與運算子(&&)的運算物件;

(4)條件運算子(x ? y : z)的條件表示式。

由於轉換到bool一般被用作條件,所以operator bool()一般用explicit來修飾。

C 11 新型的型別轉換

include typedef void pf int struct point int main 輸出 無警告,無錯誤 段錯誤c 方式強制型別轉換存在的問題 問題 強制型別轉換在實際工程中是很完全難避免的!如何進行更加安全可靠的轉換呢?static cast const cast dynamic ...

c 11 強制轉換

c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dynamic cast,命名上理解是動態型別轉換。如子類和父類之間的多型型別轉換。reinterprete...

c 11 型別的轉換的traits

template struct remove const 移除const template struct add const 新增const template struct remove reference 移除引用 template struct add lvalue reference 新增左值...