一、static_cast型別轉換
static_cast 應用於c++可以隱式轉換的型別之間,包括雙向隱式轉換和單向隱式轉換。
例如:
雙向隱式轉換:
int a;
char b;
a = static_cast
(b); //可以直接通過隱式轉換,轉換型別:a = b
b = static_cast
(a); //可以直接通過隱式轉換,轉換型別:b = a
單向隱式轉換:
int* a;
void* b;
a = static_cast
(b); //void*型別不能直接換成int*型別,故不能直接使用a = b進行隱式轉換,會編譯出錯
b = static_cast
(a); //void*可以接受任何指標型別,故可以直接通過隱式轉換,轉換型別:b = a
二、reinterpret_cast型別轉換
reinterpret_cast針對不能雙方都不能通過隱式型別轉換時,強制型別轉換。
例如:
int* p;
char* q;
p = reinterpret_cast
(q); //q不能隱式轉換成p,若寫成p = q;編譯報錯
q = reinterpret_cast
(p); //p不能隱式轉換成q,若寫成q = p;編譯報錯
**中int*和char*之間不能相互隱式轉換,故必須用reinterpret_cast進行強制轉換
三、const_cast
const_cast說白了並不是一種型別轉換,只是把常量的const標籤給去掉了,方便函式呼叫時的引數型別轉換。
例如:
void func(int &a)
int main()
由const int 轉到int&是不允許的,本身定義const就不允許修改變數,讓const常量賦給乙個非const的引用,這是不允許的,萬一你修改了呢,就算你保證不去修改,那也不讓你這個幹。這個時候可以用:
func(const_cast
a);
這麼去呼叫就可以通過編譯了,那麼看一下main函式中的常量a的值是否改變了呢。
顯然main函式中的常量a並沒有改變。
那位址呢:
位址是相同的,那為什麼位址相同,值卻不同呢,const常量和#define巨集定義一樣,系統在讀取常量或者巨集定義時,直接把值替換成了數值,而不會去位址看看儲存的這個值是多少。
上面是乙個引用的例子,再舉個指標的例子:
const
int a = 10;
int *pi = const_cast
(&a);
*pi = 200;
cout
<< "a = "
<< a << " "
<< "*pi = "
<< *pi << endl;
cout
<< "&a = "
<< &a << " "
<< "pi = "
<< pi << endl;
所以說雖然const_cast去掉了常量const的標籤,但const就是const,是絕對不允許改變的。但存在一種特殊情況:
struct a;
const a ad;
a *rp = const_cast
(&ad);
rp->data = 200;
cout
<< "ad = "
<< ad.data << " "
<< "*rp = "
<< rp->data << endl;
cout
<< "&ad = "
<< &ad << " "
<< "rp = "
<< rp << endl;
自定義乙個結構體型別a,宣告了乙個a型別的常量ad,通過const_cast去掉了const的標籤,讓非const的指標rp指向了ad,並修改了rp所指向的值,其結果呢:
此時ad的值卻改變了,這又是為什麼呢?
msdn中對此的解釋是:對於自定義型別的指標,引用操作被當做未定義的操作,(個人理解:相當於自定義的官方不管,也就是說被放棄了,愛咋滴咋滴)。
C 之型別轉換
實現將a類的物件轉換為b類物件的方法有3種 a類物件 方法一 如果a為基類,b為派生類,能夠將派生類的物件轉換基類的物件,如b b a a b 方法二 在a類物件中定義轉換建構函式 單形參建構函式 除掉預設形參 並將b類物件作為形參,同一時候禁止使用explicit關鍵子,形如 a b b,int ...
C 之型別轉換
1.發生型別轉換的時機 賦值運算,方法傳參。2.分類 1 根據轉換方法的不同 顯示轉換 explicit 隱式轉換 implicit 如果在 中明確指明了目標型別例稱之為顯示型別轉換如 int x int y,否則稱之為隱式型別轉換如 long y x。顯示和隱式轉換都可能失敗 顯示失敗,則丟擲執行...
c 之類型別轉換
資料型別轉換在程式編譯時或在程式執行實現 基本型別 基本型別 基本型別 類型別 類型別 類型別 類物件的型別轉換可由兩種方式說明 建構函式 轉換函式 稱為使用者定義的型別轉換或類型別轉換,有隱式呼叫和顯式呼叫方式 1 class x 2 7 void f x arg 8 9 x a x 1 a 1,...