C++ 類型轉換

一、強制類型轉換

C方式的強制類型轉換c++

(Type)(Expression)
Type (Expression)
#include <stdio.h>

typedef void(PF)(int);

struct Point
{
    int x;
    int y;
};

int main()
{
    int v = 0x12345;
    PF* pf = (PF*)v;
    char c = char(v);
    Point* p = (Point*)v;
    
    pf(5);
    
    printf("p->x = %d\n", p->x);
    printf("p->y = %d\n", p->y);

    return 0;
}

C方式強制類型轉換存在的問題函數

  • 過於粗暴:任意類型之間均可以進行轉換,編譯器很難判斷其正確性
  • 難於定位:在源碼中沒法快速定位全部使用強制類型轉換的語句

C語言的強制類型轉換已經足夠簡單了,若是從語法上進行改進,產生的新的語言,必然沒辦法兼容原來的餘元,因此沒辦法直接改進強制類型轉換,必須提出新的辦法設計

C++在設計時,進行了強制類型轉換的功能上的劃分,分爲了4中不一樣的類型,產生了4個不一樣的關鍵字指針

static_castcosnt_castdynamic_castreinterpret_castcode

用法:xxx_cast<Type>(Expression)對象

用關鍵字進行強制類型轉換,搜素關鍵字就能夠將全部用到強制類型轉換的地方所有搜索出來,方便定位繼承

  • static_cast:靜態類型轉換

    用於基本類型間的轉換編譯器

    不能用於基本類型指針間的轉換源碼

    用於由繼承關係類對象之間的轉換和類指針之間的轉換io

  • cosnt_cast

    用於去除變量的只讀屬性

    強制類型轉換的目標類型必須是指針或引用

  • reinterpret_cast

    用於指針類型間的強制轉換

    用於整數和指針類型間的強制轉換

  • dynamic_cast

    用於由繼承關係的類指針間的轉換

    用於由交叉關係的類指針間的轉換

    具備類型檢查的功能

    須要虛函數的支持

#include <stdio.h>

void static_cast_demo()
{
    int i = 0x12345;
    char c = 'c';
    int* pi = &i;
    char* pc = &c;
    
    c = static_cast<char>(i);    // 將i強制類型轉化爲char
    pc = static_cast<char*>(pi);    // 整型轉 char *
                                // err
}

void const_cast_demo()
{
    const int& j = 1;    // 只讀變量
    int& k = const_cast<int&>(j); // 去除了只讀屬性
    
    const int x = 2;    // 常量
    int& y = const_cast<int&>(x);    // 不能去除常量的只讀屬性,可是會從新分配一個新的空間,y是別名
    
    int z = const_cast<int>(x);        // cosnt_cast只能用於指針或引用,目標類型爲int, err
    
    k = 5;
    
    printf("k = %d\n", k);
    printf("j = %d\n", j);
    
    y = 8;
    
    printf("x = %d\n", x);
    printf("y = %d\n", y);
    printf("&x = %p\n", &x);
    printf("&y = %p\n", &y);
}

void reinterpret_cast_demo()
{
    int i = 0;
    char c = 'c';
    int* pi = &i;
    char* pc = &c;
    
    pc = reinterpret_cast<char*>(pi);
    pi = reinterpret_cast<int*>(pc);
    pi = reinterpret_cast<int*>(i);
    c = reinterpret_cast<char>(i);     // err,
}

void dynamic_cast_demo()
{
    int i = 0;
    int* pi = &i;
    char* pc = dynamic_cast<char*>(pi);    // 類指針之間,且要虛函數,故err
}

int main()
{
    static_cast_demo();
    const_cast_demo();
    reinterpret_cast_demo();
    dynamic_cast_demo();
    
    return 0;
}

二、小結

C方式的強制類型轉換

  • 粗暴
  • 潛在的問題不容易發現
  • 不易在代碼中定位

C++關鍵字方式的新式類型轉換

  • 編譯器可以幫助檢查潛在的問題
  • 很是方便地在代碼中定位
  • 支持動態類型識別(dynamic_cast
相關文章
相關標籤/搜索