1. 程式人生 > 其它 >第一次個人總結

第一次個人總結

為什麼需要更加細粒度的強制型別轉換?

C語言中的顯示強制轉換能夠強調風險,要程式設計師意識到他在做什麼
但是粒度過大,C風格的強制型別轉換統一使用(),而()在程式碼中隨處可見,所以也不利於使用文字檢索工具(例如 Windows 下的 Ctrl+F、Linux 下的 grep 命令、Mac 下的 Command+F)定位關鍵程式碼。

在c++中有4中強制型別轉換

關鍵字 說明
static_cast 用於良性轉換,一般不會導致意外發生,風險低
const_cast 用於const與非const,volatile與非volatile之間的轉換
reinterpret_cast 高度危險的轉換,這種轉換僅僅是對二進位制位的重新解釋,不會藉助已有的轉換規則對資料進行調整,但是可以實現最靈活的 C++ 型別轉換。
dynamic_cast 藉助 RTTI(Run Time Type Identification),用於型別安全的向下轉型(Downcasting)。

用法皆為:
xxx_cast<newType>(data)
C語言風格型別轉換:

double scores = 95.5;
int n = (int)scores;

C++風格型別轉換:

double scores = 95.5;
int n = static_cast<int>(scores);

static_cast

const_cast

reinterpret_cast

與C語言中的顯示強轉類似
風險很高,reinterpret_cast只是對二進位制位的重新解釋,不會藉助已有的轉換規則對資料進行調整。
reinterpret_cast 可以認為是 static_cast 的一種補充,一些 static_cast 不能完成的轉換,就可以用 reinterpret_cast 來完成,例如兩個具體型別指標之間的轉換、int 和指標之間的轉換(有些編譯器只允許 int 轉指標,不允許反過來)。

編譯器處理,執行的是逐位元組的複製
能夠轉換:

  • 不同型別間的指標
  • 不同型別的引用
  • 指標與能夠容納指標的整數型別之間的轉換
#include <iostream>
using namespace std;
class A {
public:
    A(int a = 0, int b = 0): m_a(a), m_b(b){}
private:
    int m_a;
    int m_b;
};
class Father {
};
class Son : public Father {
};
int main(){
    //將 char* 轉換為 float*
    char str[]="http://c.biancheng.net";
    float *p1 = reinterpret_cast<float*>(str);
    cout<<*p1<<endl;
    //將 int 轉換為 int*
    int *p = reinterpret_cast<int*>(100);
    //將 A* 轉換為 int*
    p = reinterpret_cast<int*>(new A(25, 96));
    cout<<*p<<endl;
    // 甚至可以把子類指標轉向父類
    Son* son;
    Father* father = nullptr;
    son = reinterpret_cast<Son*>father;

    return 0;
}

dynamic_cast