注意:盡量少使用轉型操作,尤其是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...