C++筆記 第四十一課 型別轉換函式(上)普通型別--類型別---狄泰學院
阿新 • • 發佈:2018-11-23
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第四十一課 型別轉換函式(上)普通型別–>類型別
1.再論型別轉換
標準資料型別之間會進行隱式的型別安全轉換
轉換規則如下:
41-1 有趣的隱式型別轉換
#include <iostream> #include <string> using namespace std; int main() { short s = 'a'; unsigned int ui = 1000; int i = -2000; double d = i; cout << "d = " << d << endl; cout << "ui = " << ui << endl; cout << "ui + i = " << ui + i << endl; if( (ui + i) > 0 ) { cout << "Positive" << endl; } else { cout << "Negative" << endl; } cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl;//實際轉換是兩者都轉換成了int return 0; } 執行結果 d = -2000 ui = 1000 ui + i = 4294966296 Positive sizeof(s + 'b') = 4
2.問題
普通型別與類型別之間能否進行型別轉換?可以
類型別之間能否進行型別轉換?可以
41-2 普通型別 -> 類型別
#include <iostream> #include <string> using namespace std; class Test { int mValue; public: Test() { mValue = 0; } explicit Test(int i) { mValue = i; } Test operator + (const Test& p) { Test ret(mValue + p.mValue); return ret; } int value() { return mValue; } }; int main() { Test t; t = static_cast<Test>(5); // t = Test(5); Test r; r = t + static_cast<Test>(10); // r = t + Test(10); cout << r.value() << endl; return 0; } 執行結果 15
3.再論建構函式
建構函式可以定義不同型別的引數
引數滿足下列條件時成為轉換建構函式
有且僅有一個引數
引數是基本型別
引數是其它類型別
4.另一個視角
舊式的C方式強制型別轉換
5.編譯器的行為
編譯器會盡力嘗試讓原始碼通過編譯
編譯器盡力嘗試的結果是隱式型別轉換
隱式型別轉換
會讓程式以意想不到的方式進行工作
是工程中bug的重要來源
工程中通過explicit關鍵字杜絕編譯器的轉換嘗試
轉換建構函式被explicit修飾時只能進行顯式轉換
轉換方式
小結
轉換建構函式只有一個引數
轉換建構函式的引數型別是其他型別
轉換建構函式在型別轉換時被呼叫
隱式型別轉換是工程中bug的重要來源
explicit關鍵字用於杜絕隱式型別轉換