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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++中的转换构造函数和类型转换函数

發布時間:2025/4/5 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的转换构造函数和类型转换函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 C++中的轉換構造函數
      • 1.1 轉換構造函數
      • 1.2 explicit關鍵字
    • 2 C++中的類型轉換函數
      • 2.1 類型轉換函數
    • 3 轉換構造函數與類型轉換函數之間的沖突
      • 3.1 轉換構造函數與類型轉換函數之間的沖突
      • 3.2 解決方案

1 C++中的轉換構造函數

1.1 轉換構造函數

我們知道構造函數可以定義不同類型的參數,參數滿足下列條件時稱為轉換構造函數:

  • 有且僅有一個參數。
  • 參數是基本類型。
  • 參數是其它類類型。

看如下代碼:

編譯器盡力嘗試的結果是隱式類型轉換,隱式類型轉換:

  • 會讓程序以意想不到的方式進行工作。
  • 是工程中bug的重要來源。

1.2 explicit關鍵字

explicit關鍵字:

  • 工程中通過explicit關鍵字杜絕編譯器的轉換嘗試。
  • 轉換構造函數被explicit修飾時只能進行顯示轉換。

    普通類型到類類型示例代碼:
#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; }

2 C++中的類型轉換函數

2.1 類型轉換函數

為了實現類類型到普通類型之間的轉換,我們需要引入類型轉換函數。

類型轉換函數:

  • C++類中可以定義類型轉換函數。
  • 類型轉換函數用于將類對象轉換為其他類型。

類型轉換函數:

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

類類型到普通類型之間的轉換:

#include <iostream> #include <string>using namespace std;class Test {int mValue; public:Test(int i = 0){mValue = i;}int value(){return mValue;}operator int (){return mValue;} };int main() { Test t(100);int i = t;cout << "t.value() = " << t.value() << endl;cout << "i = " << i << endl;return 0; }

3 轉換構造函數與類型轉換函數之間的沖突

3.1 轉換構造函數與類型轉換函數之間的沖突

#include <iostream> #include <string>using namespace std;class Test;class Value { public:Value(){}explicit Value(Test& t){} };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; // 編譯error,轉換構造函數和類型轉換函數都可以完成,編譯器不知道選擇哪一個函數,我們可以將轉換構造函數前加上explicit關鍵字return 0; }

3.2 解決方案

轉換構造函數與類型轉換函數:

  • 無法抑制隱式的類型轉換函數調用。
  • 類型轉換函數可能與轉換構造函數沖突。
  • 工程中以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++深度解析教程
  • 總結

    以上是生活随笔為你收集整理的C++中的转换构造函数和类型转换函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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