C 之型別轉換

2021-07-11 23:08:03 字數 2280 閱讀 3992

一、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,...