【C++的深度剖析教程21】类型转换函数下
上一篇文章寫了關于普通類型轉換為類類型的語法與性質,今天我們來看一下:類類型如何轉換為普通類型。
一、類型轉換函數:
C++類中,可以定義類型轉換函數,類型轉換函數用于將類對象轉換為其他類型。
語法規則:
operator type() {type ret;...return ret; }下面還是直接寫代碼看看什么是類型轉換函數:
#include <iostream> #include <string>using namespace std;class Test {int mValue; public:Test(int i = 0){mValue = i;}int value(){return mValue;}operator int () //轉換構造函數{int ret = mValue; //這里相當于有一個轉換,類的值給int了return ret;;} };int main() { Test t(100);int i = t; //等價于:i = t.operator int() ;相當于隱式的調用了成員函數operator int ()cout << "t.value() = " << t.value() << endl;cout << "i = " << i << endl;return 0; }運行結果為:
t.value() = 100
i = 100
由運行結果知,我們成功的將一個類類型的值賦值給int類型,所以說,類類型,已經成功轉換為int類型。
可以看看下圖的巧妙的解釋:
那么總結一下類類型的一些特點:
二、類類型之間的轉換
上面講了類類型轉換為其他類型,那么類類型轉換為類類型呢?
語法與類型轉換函數類似,只不過我們類型轉換函數的類型,改為類類型即可:
看這個規則不如直接寫一段代碼,下面我們還是來直接寫一段代碼來分析吧:
#include <iostream> #include <string>using namespace std;class Test;class Value { public:Value(){}explicit Value(Test& t) //與下面的operator Value()互斥(他們均能被隱式的自動調{ //用),所以加上explicit關鍵字讓它只能被顯示的調用} };class Test {int mValue; public:Test(int i = 0){mValue = i;}int value(){return mValue;}operator Value() //類類型轉換為類類型時調用的函數{Value ret;cout << "operator Value()" << endl;return ret;} };int main() { Test t(100);Value v = t; //等下于v = t.operator Value()return 0; }運行結果:
operator Value()
編譯通過沒有報錯,說明這一句:Value v = t;是可以被編譯通過的,Test類類型轉換為Value類類型成功。
而這里寫成 explicit Value(Test& t),加上explicit是因為:編譯器無法抑制隱式的類型轉換函數,那么它與下面的operator Value()互斥,當編譯到Value v = t這里時,需要隱式調用轉換函數,可以調用Value(Test& t) ,也可以調用 operator Value(),這個時候編譯器就會犯難,報錯!!!所以在Value(Test& t) 前面加上抑制隱式;類型調用的關鍵字:explicit。
既然類型轉換函數與轉換構造函數會產生沖突,那么工程中是如何解決的呢?
在QT這種非常成熟的編譯器里,都是用type toType()公有成員函數代替類型轉換函數的。
看下面一個在QT中編寫的函數,就很好理解了:
三、總結:
想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。
總結
以上是生活随笔為你收集整理的【C++的深度剖析教程21】类型转换函数下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: This is Me!——回顾第一个项目
- 下一篇: C++允许重载的运算符和不允许重载的运算