1,轉換構造函數可以將普通的基礎類型轉換為當前的類類型,也有能力將其它類類 型的對象轉換為當前的類類型;
2,問題:
1,類類型是否能夠類型轉換到普通類型?
1,可以的;
3,類型轉換函數:
1,C++ 類中可以定義類型轉換函數;
2,類型轉換函數用於將類對象轉換為其他類型;
1,不管什么類型都可以;
3,語法規則:
1,代碼示例:
1 operator Type () // operator 表示定義類型轉換函數,Type 表示返回值,沒有參數; 2 { // 函數體表示普通的函數體內容; 3 Type ret; 4 5 // ... 6 7 return ret; 8 }
4,類型轉換函數初探編程實驗:
1,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Test 7 { 8 int mValue; 9 public: 10 Test(int i = 0) 11 { 12 mValue = i; 13 } 14 int value() 15 { 16 return mValue; 17 } 18 operator int () // 類型轉換函數; 19 { 20 return mValue; 21 } 22 }; 23 24 int main() 25 { 26 Test t(100); 27 int i = t; // ==> int i = t.operator int(); 隱式調用類型轉換成員函數;這里實質是隱式類型轉換; 28 29 cout << "t.value() = " << t.value() << endl; 30 cout << "i = " << i << endl; 31 32 return 0; 33 }
4,類型轉換函數:
1,與轉換構造函數具有同等的地位;
2,使得編譯器有能力將對象轉化為其它類型;
3,編譯器能夠隱式的使用類型轉換函數;
4,編譯器會盡力嘗試讓源碼通過編譯:
1,這里實質是隱式類型轉換;
5,類類型之間的相互轉換:
1,類型轉換函數 VS 轉換構造函數
2,類類型之間的轉換編程實驗:
1,main.cpp 文件:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Test; 7 8 class Value 9 { 10 public: 11 Value() 12 { 13 } 14 explicit Value(Test& t) 15 { 16 } 17 }; 18 19 class Test 20 { 21 int mValue; 22 public: 23 Test(int i = 0) 24 { 25 mValue = i; 26 } 27 int value() 28 { 29 return mValue; 30 } 31 operator Value() 32 { 33 Value ret; 34 cout << "operator Value()" << endl; 35 return ret; 36 } 37 /* 38 工程上通過以下方式; 39 Value toValue() 40 { 41 Value ret; 42 43 return ret; 44 } 45 */ 46 }; 47 48 int main() 49 { 50 Test t(100); 51 Value v = t; // ==> t.operator value(); 52 // Value v = t.toValue(); // 工程上針對類型轉換函數來杜絕隱式類型轉換的用法; 53 54 return 0; 55 }
2,編譯輸出:
1,當 Value 類構造函數不加 explicit 修飾時:
error: conversion from ‘Test’ to ‘Value’ is ambiguous
note: candidates are: Test::operator Value()
note: Value::Value(Test&)
2,當 Value 類構造函數加 explicit 修飾時:
1,編譯通過;
3,轉換構造函數和類型轉換函數是互逆的,但是當遇到類類型之間的轉換時,它們之間是有沖突的,編譯器不知道如何選擇,應該在轉換構造函數之前加 explicit 修飾;
3,無法抑制隱式的類型轉換函數調用;
4,類型轉換函數可能與轉換構造函數沖突;
1,可通過 explicit 修飾轉換構造函數解決;
5,工程中以 Type toType() 的公有成員代替類型轉換函數;
1,工程中一般不定義類型轉換函數;
2,抑制類型轉換函數調用;
3,Qt 中的示例:
1 #include <QDebug> 2 #include <QString> 3 4 int main() 5 { 6 QString str = ""; 7 int i = 0; 8 double d = 0; 9 short s = 0; 10 11 str = "-255"; 12 13 /* 以下進行了類類型到基礎類型之間的轉換 */ 14 i = str.toInt(); 15 d = str.toDouble(); 16 s = str.toShort(); 17 18 qDebug() << "i = " << i << endl; 19 qDebug() << "d = " << d << endl; 20 qDebug() << "s = " << s << endl; 21 22 return 0; 23 }
5,小結:
1,C++ 類中可以定義類型轉換函數;
2,類型轉換函數用於將類對象轉換為其它類型;
3,類型轉換函數與轉換構造函數具有同等的地位;
4,工程中以 Type toType() 的公有成員代替類型轉換函數;