1. 程式人生 > >C++筆記 第四十一課 型別轉換函式(上)普通型別--類型別---狄泰學院

C++筆記 第四十一課 型別轉換函式(上)普通型別--類型別---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux

第四十一課 型別轉換函式(上)普通型別–>類型別

1.再論型別轉換

標準資料型別之間會進行隱式的型別安全轉換
轉換規則如下:
在這裡插入圖片描述

41-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;//實際轉換是兩者都轉換成了int
    
    return 0;
}
執行結果
d = -2000
ui = 1000
ui + i = 4294966296
Positive
sizeof(s + 'b') = 4

2.問題

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

41-2 普通型別 -> 類型別

#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;
}
執行結果
15

3.再論建構函式

建構函式可以定義不同型別的引數
引數滿足下列條件時成為轉換建構函式
有且僅有一個引數
引數是基本型別
引數是其它類型別

4.另一個視角

舊式的C方式強制型別轉換
在這裡插入圖片描述

5.編譯器的行為

編譯器會盡力嘗試讓原始碼通過編譯
在這裡插入圖片描述
編譯器盡力嘗試的結果是隱式型別轉換
隱式型別轉換
會讓程式以意想不到的方式進行工作
是工程中bug的重要來源
工程中通過explicit關鍵字杜絕編譯器的轉換嘗試
轉換建構函式被explicit修飾時只能進行顯式轉換

轉換方式
在這裡插入圖片描述
小結
轉換建構函式只有一個引數
轉換建構函式的引數型別是其他型別
轉換建構函式在型別轉換時被呼叫
隱式型別轉換是工程中bug的重要來源


explicit關鍵字用於杜絕隱式型別轉換