C++的四種新式顯示轉換和一種舊式顯示轉換

C++的四種新式顯示轉換和一種舊式顯示轉換

一、靜態轉換(static_cast)

    static_cast包含的轉換類型有典型的非強制變換窄化(有信息丟失)變換使用void*的強制轉換隱式類型ios

    變換類層次的靜態定位。static_cast是編譯器容許的。安全

(1)典型的非強制變換

    從窄類型向寬類型的轉換,如char向short int,int,long int,float,double,long double的轉換。spa

char a = 1;
long b = static_cast<long>(a);

(2)窄化變換

    與第1種相反,從寬類型向窄類型的變換。指針

long b = 1;
char a = static_cast<char>(b);

(3)使用void*的強制變換

  任何非const型指針均可以賦予void*,void*被用於對象的確切類型未知或者特定環境下對象類型發生變化的情code

  況下!void*不能直接被解除引用,由於沒有類型信息可用來知道編譯器怎麼解釋低層位模板!void*必須轉換對象

  成某類型的指針,C++中沒有void*到特殊類型的自動轉換!必須顯示強制轉換!繼承

struct callback_param
{
    void *vp;
};
int a = 1;
struct callback_param cp;
cp.vp = &a;      //編譯器容許從任意類型指針向void*轉換
int *ip = static_cast<int *>(cp.vp);

(4)隱式類型轉換

    包括(1)(2)ip

(5)類層次的靜態定位

    進行向上類型轉換(派生類向基類轉換)時,編譯器清楚派生自什麼祖先類,除了多繼承(多繼承轉換後可能不爲編譯器

    原地址,指針會在類層次中調整)。io


二、常量轉換(const_cast)

    從const轉換爲非const,從volatile轉換爲非volatile。取得const對象的地址,會生成一個指向const的指針,

    volatile同。 

const int i = 0;
int *ip = const_cast<int *>(&i);
volatile int a = 0;
int *ap = const_cast<int *>(&a);


三、重解釋轉換(reinterpret_cast)

    最不安全的一種轉換機制,將對象轉變爲徹底不一樣類型的對象,這是低級的位操做。

struct msg_hdr
{
    int msg_type;
    int msg_len;
    char msg_data[0];
};
 
struct msg_data
{
    int data1;
    int data2;
};
 
struct msg_hdr *p = reinterpret_cast<struct msg_hdr *>(recvbuf);
struct msg_data *pdata = reinterpret_cast<struct msg_data *>(p->msg_data);


四、動態轉換(dynamic_cast)

    類層次的向下轉換(基類向派生類轉換),轉換過程當中會經過RTTI檢查轉換類型是否正常,不正常將返回空。

#include <iostream>
using namespace std;
class pet{    
public:    
    virtual ~pet()    
    {    
}};

class dog : public pet{};

class cat : public pet{};

int main(void){    
    pet *b = new cat;    
    dog *d1 = dynamic_cast<dog *>(b);    
    cat *d2 = dynamic_cast<cat *>(b);    
    cout << "d1 = " << (long)d1 << endl;  // d1 = 0    
    cout << "d2 = " << (long)d2 << endl;
}


5舊式強制類型轉換

  舊式強制類型能夠用來替代上面的C++中新式強制類型轉換,對舊式強制類型轉換的支持,是爲了保持向後

  兼容性,以及提供與C語言兼容的符號!

  格式:(expr) type  例如:

Const char* a = (const char*)b;
int* b        = (int*)d;
相關文章
相關標籤/搜索