#include#include#includeusing namespace std;
/*static_cast:
用法:static_cast < type-id > ( expression )
該運算子把expression轉換為type-id型別,但沒有執行時型別檢查來保證轉換的安全性。它主要有如下幾種用法:
①用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。static_cast
static_cast
進行上行轉換(把派生類的指標或引用轉換成基類表示,物件也可以)是安全的;
進行下行轉換(把基類指標或引用轉換成派生類表示)時,由於沒有動態型別檢查,所以是不安全的,無任何效果
②用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
③把空指標轉換成目標型別的空指標。
④把任何型別的表示式轉換成void型別。
*//*
dynamic_cast:
用法:dynamic_cast < type-id > ( expression )
type-id 必須是個多型型別,即必須要含有虛函式,類中有虛表才能儲存 執行時類別資訊。
該運算子把expression轉換成type - id型別的物件。type - id必須是類的指標、類的引用或者void*;
如果type - id是類指標型別,那麼expression也必須是乙個指標,如果type - id是乙個引用,那麼expression也必須是乙個引用。
dynamic_cast運算子可以在執行期決定真正的型別。如果downcast是安全的(也就說,如果基類指標或者引用確實指向乙個派生類物件)這個運算子會傳回適當轉型過的指標。如果downcast不安全,這個運算子會傳回空指標(也就是說,基類指標或者引用沒有指向乙個派生類物件)。
dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。
在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;
在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。
*//*
const_cast
用法:const_cast < type-id > ( expression )
該操作符用於改變const和volatile,const_cast最常用的用途就是刪除const屬性,如果某個變數在大多數時候是常量,而在某個時候又是需要修改的,這時就可以使用const_cast操作符了。但是不能改變其值型別,只能改變屬性。
*//*
reinterpret_cast(expression)
type-id 必須是乙個指標、引用、算術型別、函式指標或者成員指標。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值)。
操作符修改了運算元型別,但僅僅是重新解釋了給出的物件的位元模型而沒有進行二進位制轉換。
*/class x
};class a :public x
};class b :public x
};/*
x/ \
a b
*/class f
};class g:public f
};int main(void)
pa = dynamic_cast(px);//得到空指標
if (nullptr != pa)
a a1;
a& refa = a1;
x& refx = dynamic_cast(a1);
refx.print();// a 反過來會產生異常
puts("----------const_cast---------------");
char c = 'a';
int k = 1;
char* pc = reinterpret_cast(&k);
short* ps= reinterpret_cast(&k);
printf("char* %p\n", &c);
printf("int*: %p\n",&k);
printf("reinterpret_cast char*%p\n",pc);
printf("reinterpret_cast short*:%p\n", ps);
printf("char* %p\n", &c+1);
printf("int*: %p\n", &k+1);
printf("reinterpret_cast char*%p\n", pc+1);
printf("reinterpret_cast short*:%p\n", ps+1);
int* p1 = &k;
printf("int*: %d\n", p1);
++p1;
printf("int*: %d\n", p1);
p1 = reinterpret_cast('a');
cout << p1 << endl;//00000041 將乙個整數轉換為指標
char ch = (char)(p1);
cout << ch << endl;//a 再轉換回來可以得到同樣的值
return 0;
}
c 四種型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a。c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 四種型別轉換
1 static cast 1.上行轉換,把派生類的指標或引用轉換成基類,此時是安全的 2.下行轉換,把基類的指標或者引用轉換成派生類,因為沒有動態監測,所以是不安全的 3.顯示型別轉換,如int轉float等 4.任意型別空指標轉任意型別空指標 5.任意型別表示式轉為void型別 如下 int a...
C 四種型別轉換
首先是static cast static cast 只允許三種轉換 基本資料型別之間轉換,如static cast int 還有就是void 指標向其他指標型別的轉換,如static cast malloc sizeof int 最後就是同乙個繼承體系下的downcasting和upcasting...