日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++的深度剖析教程21】类型转换函数下

發布時間:2023/12/10 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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類型。
可以看看下圖的巧妙的解釋:

那么總結一下類類型的一些特點:

  • 與轉換構造函數具有同等的地位
  • 使得編譯器有能力將類類型轉換為其他類型
  • 編譯器能夠隱式的使用類型轉換函數
  • 二、類類型之間的轉換

    上面講了類類型轉換為其他類型,那么類類型轉換為類類型呢?
    語法與類型轉換函數類似,只不過我們類型轉換函數的類型,改為類類型即可:

    operator class() //這個class是一個類對象,在這里是需要將它轉換為另一個類類型 {class ret;...return ret; }

    看這個規則不如直接寫一段代碼,下面我們還是來直接寫一段代碼來分析吧:

    #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中編寫的函數,就很好理解了:

    #include <QDebug> #include <QString>int main() {QString str = "";int i = 0;double d = 0;short s = 0;str = "-255";i = str.toInt(); //核心在這三個調用d = str.toDouble();s = str.toShort();qDebug() << "i = " << i << endl;qDebug() << "d = " << d << endl;qDebug() << "s = " << s << endl;return 0; }

    三、總結:

  • C++類中可以定義類型轉換函數
  • 類型轉換函數用于將類對象轉換為其他類型
  • 類型轉換函數與轉換構造函數具有同等的地位
  • 工程中用Type toType()公有的成員函數代替類型轉換函數
  • 想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
    qq:1126137994
    微信:liu1126137994
    可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。

    總結

    以上是生活随笔為你收集整理的【C++的深度剖析教程21】类型转换函数下的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。