C 4種cast強制型別轉換

2021-10-08 14:29:52 字數 2962 閱讀 5639

注意:盡量少使用轉型操作,尤其是dynamic_cast,耗時較高,會導致效能的下降,盡量使用其他方法替代。

const_cast

定義:const_cast轉換符是用來移除變數的const或volatile限定符

const int constant = 21;

const int* const_p = &constant;

int* modifier = const_cast(const_p);

*modifier = 7;

//傳統方式用指標來實現,因為指標之間在型別轉換的時候不會檢查

//const int constant = 21;

//const int* const_p = &constant;

//int* modifier = (int*)(const_p);

//但是

cout << "constant: "<< constant 《說明c++裡是const,就是const,外界千變萬變,我就不變。不然真的會亂套了,const也沒有存在的意義了。

原因:因為我們將資料型別定義為const,自然就不會去改變他,但是,我們可能呼叫了乙個引數不是const的函式,而我們要傳進去的實際引數確實const的,但是我們知道這個函式是不會對引數做修改的。於是我們就需要使用const_cast去除const限定,以便函式能夠接受這個實際引數。

void printer (int* val,string seperator = "\n")

int main(void)

另一種情況:

int variable = 21;

const int* const_p = &variable;

int* modifier = const_cast(const_p);

*modifier = 7;

cout << "variable:" << variable << endl;

我們定義了乙個非const的變數,但用帶const限定的指標去指向它,在某一處我們突然又想修改了,可是我們手上只有指標,這時候我們可以去const來修改了。

static_cast

相當於傳統的c語言裡的強制轉換

注意:static_cast不能轉換掉表示式的const、volatile、或者__unaligned屬性

char a = 'a';

int b = static_cast(a);//正確,將char型資料轉換成int型資料

double *c = new double;

void *d = static_cast(c);//正確,將double指標轉換成void指標

int e = 10;

const int f = static_cast(e);//正確,將int型資料轉換成const int型資料

const int g = 20;

int *h = static_cast(&g);//編譯錯誤,static_cast不能轉換掉g的const屬性

class base

{};class derived : public base

{}base* pb = new base();

if(derived* pd = static_cast(pb))

{}//下行轉換是不安全的(堅決抵制這種方法)

derived* pd = new derived();

if(base* pb = static_cast(pd))

{}//上行轉換是安全的

dynamic_cast

只能用於含有虛函式的類,主要用於執行「安全的向下轉型」

轉換方式:

e的型別必須符合以下三個條件中的任何乙個:

1、e的型別是目標型別type的公有派生類

2、e的型別是目標type的共有基類

3、e的型別就是目標type的型別。

如果一條dynamic_cast語句的轉換目標是指標型別並且失敗了,則結果為0。如果轉換目標是引用型別並且失敗了,則dynamic_cast運算子將丟擲乙個std::bad_cast異常(該異常定義在typeinfo標準庫標頭檔案中)。e也可以是乙個空指標,結果是所需型別的空指標。

dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換(cross cast)。

在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。dynamic_cast是唯一無法由舊式語法執行的動作,也是唯一可能耗費重大執行成本的轉型動作。

dynamic_cast與繼承層次的指標

向上轉型:永遠安全,不必要使用

向下轉型:

//一種是基類指標所指物件是派生類型別的,這種轉換是安全的;

//另一種是基類指標所指物件為基類型別,在這種情況下dynamic_cast在執行時做檢查,轉換失敗,返回結果為0;

#includeusing namespace std;

class base

; virtual void show()

};class derived:public base

; void show()

};int main()

else

catch(bad_cast)

{cout<<"轉化失敗,丟擲bad_cast異常"用來處理無關型別之間的轉換;它會產生乙個新的值,這個值會有與原始引數(expressoin)有完全相同的位元位。

注意:嚴禁隨意使用

獲取元素型別#includetypeid(ss).name()

//typeof()是gnu++11自己新增的

C 4種強制型別轉換

c 的四種強制型別轉換為 static cast const cast reinterpret cast和dynamic cast 型別轉換的一般形式 cast name expression 任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static cast double sl...

C 4種型別轉換

c 型別轉換 const cast,去const屬性。static cast,靜態型別轉換。如int轉換成char。dynamic cast,動態型別轉換。如子類和父類之間的多型型別轉換。reinterpret cast,僅僅重新解釋型別,但沒有進行二進位制的轉換。const cast const ...

C 4種型別轉換

總 結 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static cast 注 頂層con...