(本文參考自《more effecitve c++》 item5 謹慎定義型別轉換函式)
自定義型別轉換函式有2種: 1.隱式型別轉換運算子; 2.單引數建構函式。
隱式型別轉換運算子是乙個成員函式:operator其後跟乙個型別和符號;不用定義函式的返回型別,因為返回型別就是這個函式的名字。
單引數建構函式是指只用乙個引數即可以呼叫的建構函式。該函式可以是只定義了乙個引數,也可以是雖定義了多個引數但第乙個引數以後的所有引數都有預設值。
型別轉換函式為程式提供了便利,但是如果控制不好,會調入陷阱;當你在不需要使用轉換函式時,這些轉換函式卻會被呼叫執行;這些不正確的程式呼叫會做出一些意想不到的事情,而又很難判斷出原因。
下面示例分析下型別轉換函式的陷阱:
1. 隱式型別轉換運算子
下面**中cout<
#include using namespace std;
class rational
//隱式型別轉換運算子,轉換為double
operator double() const{}
//函式顯示轉換為double
double asdouble() const{}
}; int main()
array(int size){}
t& operator(int index){}
};bool operator==( const array& lhs, const array& rhs){}
arraya(10);
arrayb(10);
int main()
}}
2.1 解決辦法1, 建構函式加上explicit
加上explicit之後,建構函式必須顯示呼叫, a==b[i]會報錯
詳見**注釋吧:
#include using namespace std;
templateclass array
//加上explicit之後,建構函式必須顯示呼叫, a==b[i]會報錯
explicit array(int size){}
t& operator(int index){}
};bool operator==( const array& lhs, const array& rhs) {}
arraya(10);
arrayb(10);
int main()
}}
2.2 解決辦法2, 使用proxy classes
這個方法比explicit要複雜,但是是一種很好的思路。
重點是: 隱式型別轉換一次是可以的,從從int 到arraysize,再轉一次(從arraysize 到array)就不合理了。
詳見**注釋:
#include using namespace std;
templateclass array
private:
int thesize;
}; //譯器無法把int 轉換成乙個臨時arraysize 物件然後通過這個臨時物件建立必須的array物件,
//因為這將呼叫兩個使用者定義(user-defined)的型別轉換,乙個從int 到arraysize,乙個從arraysize 到array。
//這種轉換順序被禁止的,所以當試圖進行比較時編譯器肯定會產生錯誤。
array(arraysize size) {}
t& operator(int index){}
};bool operator==( const array& lhs, const array& rhs) {}
arraya(10);
arrayb(10);
int main()
}}
自定義型別轉換
這裡說點平常不怎麼用的知識 也不建議在專案中執行,因為增加閱讀 成本 自定義型別轉換,有兩型別 一是型別間隱式轉換,一是型別間強制轉換。定義格式 訪問修飾符 static 轉換修飾操作符 operator 型別 引數列表 轉換修飾操作符 class myage public myage privat...
springboot自定義轉換型別
吐槽一下 首先springboot內建了124種轉換型別 基本上可以滿足我們的開發需要,但是總有一些需求讓你頭疼 吐槽完畢進入正題 1.1 configuration proxybeanmethods false 註解用來宣告當前類是個配置類 1.2new converter表示將string 轉換...
資料型別轉換與自定義函式
1.int float str bool 使用以上四種函式可以對不同變數型別進行轉換。例如 int 123 float 3.3 str 111 bool 0 上面例子中,前兩個語句將字串分別轉換為了整數型和浮點型,第三個語句將整數型轉換成字串,最後乙個將資料轉換成布林型。注意,對於bool轉換,只有...