首頁 > 軟體

C++圖文並茂講解型別轉換函數

2022-05-31 14:00:57

一、型別轉換函數(上)

1.再論型別轉換

標準資料型別之間會進行隱式的型別安全轉換

轉換規則如下:

下面來看一個有趣的隱式型別轉換:

#include <iostream>
#include <string>
using namespace std;
int main()
{   
    short s = 'a';
    unsigned int ui = 1000;
    int i = -2000;
    double d = i;
    cout << "d = " << d << endl;
    cout << "ui = " << ui << endl;
    cout << "ui + i = " << ui + i << endl;
    if( (ui + i) > 0 )
    {
        cout << "Positive" << endl;
    }
    else
    {
        cout << "Negative" << endl;
    }
    cout << "sizeof(s + 'b') = " << sizeof(s + 'b') << endl;
    return 0;
}

輸出結果如下:

ui 為 unsigned int 型別,i 為 int 型別,將兩者進行相加編譯器會進行隱式的型別轉換,全部變成unsigned int 型別,所以最後的執行結果是正數。

s 和 'b 編譯器都被編譯器轉換成 int 型別,因為 int 型別的運算是最高效的。

2.問題

普通型別與類型別之間能否進行型別轉換?類型別之間能否進行型別轉換?

3.再論建構函式

建構函式可以定義不同型別的引數

引數滿足下列條件時稱為轉換建構函式

  • 有且僅有一個引數
  • 引數是基本型別
  • 引數是其它類型別

4.另一個視角

舊式的 C 方式強制型別轉換

5.編譯器的行為

編譯器會盡力嘗試讓原始碼通過編譯

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

隱式型別轉換

會讓程式以意想不到的方式進行工作

是工程中 bug 的重要來源

工程中通過 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;
}

輸出結果如下:

6.小結(上) 

  • 轉換建構函式只有一個引數
  • 轉換建構函式的引數型別是其它型別
  • 轉換建構函式在型別轉換時被呼叫
  • 隱式型別轉換是工程中 bug 的重要來源
  • explicit關鍵字用於杜絕隱式型別轉換

二、型別轉換函數(下)

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;
}

int i = t; 等價於int i = t.operator int ();

型別轉換函數

  • 與轉換建構函式具有同等的地位
  • 使得編譯器有能力將物件轉化為其它型別
  • 編譯器能夠隱式的使用型別轉換函數

2.編譯器的行為

編譯器會盡力嘗試讓原始碼通過編譯

3.注意事項

  • 無法抑制隱式的型別轉換函數呼叫
  • 型別轉換函數可能與轉換建構函式衝突
  • 工程中以 Type toType() 的公有成員代替型別轉換函數

下面看類型別之間的轉換:

#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;
    }
    Value toValue()
    {
        Value ret;
        cout << "operator Value()" << endl;
        return ret;
    }
};
int main()
{   
    Test t(100);
    Value v = t.toValue();
    return 0;
}

輸出結果如下:

注意型別轉換函數可能與轉換建構函式衝突,所以 explicit Value(Test& t) { } 加了一個 explicit,如果不加,編譯器可能會報錯。

4.小結(下)

  • C++ 類中可以定義型別轉換函數
  • 型別轉換函數用於將類物件轉換為其它型別
  • 型別轉換函數與轉換建構函式具有同等的地位
  • 工程中以 Type toType() 的公有成員代替型別轉換函數

到此這篇關於C++圖文並茂講解型別轉換函數的文章就介紹到這了,更多相關C++類別型轉換函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com