static_cast包含的轉換類型有典型的非強制變換、窄化(有信息丟失)變換、使用void*的強制轉換、隱式類型ios
變換、類層次的靜態定位。static_cast是編譯器容許的。安全
從窄類型向寬類型的轉換,如char向short int,int,long int,float,double,long double的轉換。spa
char a = 1; long b = static_cast<long>(a);
與第1種相反,從寬類型向窄類型的變換。指針
long b = 1; char a = static_cast<char>(b);
任何非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);
包括(1)(2)ip
進行向上類型轉換(派生類向基類轉換)時,編譯器清楚派生自什麼祖先類,除了多繼承(多繼承轉換後可能不爲編譯器
原地址,指針會在類層次中調整)。io
從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);
最不安全的一種轉換機制,將對象轉變爲徹底不一樣類型的對象,這是低級的位操做。
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);
類層次的向下轉換(基類向派生類轉換),轉換過程當中會經過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; }
舊式強制類型能夠用來替代上面的C++中新式強制類型轉換,對舊式強制類型轉換的支持,是爲了保持向後
兼容性,以及提供與C語言兼容的符號!
格式:(expr) type 例如:
Const char* a = (const char*)b; int* b = (int*)d;