注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境:ubuntu 10.10
gcc版本:9.2.0
一、再論型別轉換
1)標準資料型別之間會進行隱式的型別安全轉換
2)轉換規則如下:
實驗分析
有趣的隱式型別轉換
41-1.cpp
#include #include using namespace std;
int main()
else
cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl; //sizeof(s + b) = 4
//s從short轉化為int,'b'從char轉化為int,然後為了高效相加
return 0;
}
操作:
1) g++ 41-1.cpp -o 41-1.out編譯正常,執行結果:
d = -2000
ui = 1000
ui + i = 4294966296
positive
sizeof(s + 'b') = 4
二、問題
普通型別與類型別之間能否進行型別轉換?類型別之間能否進行型別轉換?
程式設計實驗
普通型別->類型別
41-2.cpp
#include #include using namespace std;
class test
test(int i)
test operator + (const test& p) //+號過載
int value()
};int main()
操作:
1) g++ 41-2.cpp -o 41-2.out編譯正確,列印結果:
15
分析:
編譯器將數值進行隱式轉換成類型別,然後進行賦值或者呼叫過載加法操作符函式。
2) 用explicit禁止隱式轉換,**如下:
#include #include using namespace std;
class test
explicit test(int i)
test operator + (const test& p) //+號過載
int value()
};int main()
g++ 41-2.cpp -o 41-2.out編譯報錯:
提示過載賦值操作符不能匹配、t=5不能正確賦值等等。
41-2.cpp:37:4: error: no match for 『operator=』 (operand types are 『test』 and 『int』)
t = 5;
錯誤:沒有匹配的'operaotr='(運算元型別是'test'和'int')
41-2.cpp:41:8: error: no match for 『operator+』 (operand types are 『test』 and 『int』)
r = t + 10;
錯誤:沒有匹配的'operaotr='(運算元型別是'test'和'int')
分析:
證明編譯器進行了優化,普通型別被隱式轉換成類型別。
3) 取消explicit,修改**:
#include #include using namespace std;
class test
test(int i)
test operator + (const test& p) //+號過載
int value()
};int main()
g++ 41-2.cpp -o 41-2.out編譯錯誤,列印結果:
15
分析:
無論是否用explicit修飾建構函式,都列印15。說明普通型別可以轉換成類型別。
三、再討論建構函式
1)建構函式可以定義不同型別的引數
2)引數滿足下列條件時成為轉換建構函式
- 有且僅有乙個引數
- 引數是基本型別
- 引數是其它類型別
四、另乙個視角
1)舊式的c方式強制型別轉換
int i;
test t;
i = int(1.5); //老舊轉換方式,1.5轉化為int
t = test(100); //100強制轉換成test,本質是呼叫test建構函式
五、編譯器的行為
1)編譯器會盡力嘗試讓原始碼通過編譯
2)編譯器盡力嘗試的結果是隱式型別轉換
3)隱式型別轉換
- 會讓程式以意想不到的方式進行工作
- 是工程中bug的重要**
4)工程中通過了explicit關鍵字杜絕編譯器的轉換嘗試
5)轉換建構函式被explicit修飾時只能進行顯示轉換
- 轉換方式(3種)
static_cast(value); //c++推薦方式
classname(value); //c方式,在c++裡是手動呼叫建構函式
(classname)value; //c方式,不推薦
小結
1)轉換建構函式只有乙個引數
2)轉換建構函式的引數型別是其它型別
3)轉換建構函式在型別轉換時被呼叫
4)隱式型別轉換是工程中bug的重要**
5)explicit關鍵字用於杜絕隱式型別轉換
41 型別轉換函式 上
標準資料型別之間會進行隱式的型別安全轉換 轉換規則如下 char short int unsigned int long unsigned long float double 範例 有趣的隱式型別轉換 include include using namespace std int main int ...
41 型別轉換函式
標準資料型別之間會進行隱式的型別安全轉換,規則如下 char short int unsigned int long unsigned long float double 小轉大 include include using namespace std int main else cout sizeo...
4 1 型別轉換
影象型別轉換就是把影象從一種型別轉換成另一種型別。opencv提供了200多種型別轉換。我們這次學三個。型別有 cv2.color bgr2gray 彩色影象轉灰度影象 cv2.color bgr2rgb bgr轉rgb cv2.color gray2bgr 灰度轉彩色 使用方法 b cv2.cvt...