您好,登錄后才能下訂單哦!
C語言中,存在強制類型轉換的概念。在C++中,C的做法同樣適用。但是,C++也有自己的類型轉換的方式,就是使用reinterpret_cast<>。例如,
char* str = "chentong"; int* p = reinterpret_cast<int*>(str);
通過這種方式,就把指向char*類型的str,強制轉換成了指向int*。
僅僅這樣做,是不夠的。因為,str指向的一個字符串,一個確定的字符串,也就是說,要求是不可改寫,也就是可讀不可寫。所以,為了達到這一目的,我們將str指向的內容不可修改。操作如下:
const char* str = "chentong";
這樣做后,確實,str所指向的內容不可修改了,但是,這樣做,又帶來一個問題,那就是,reinterpre_cast<>這種強制轉換,不可以去掉類似與const這樣的屬性。所以,我們要通過一些手段,將str的const屬性去掉。幸運的是,C++確實提供了解決方案。通過const_cast<>。代碼如下:
const char* str = "chentong"; char* str2 = const_cast < char* > ( str );
這樣一來,就去掉了str的const屬性。
那么,完整的操作方式,
const char* str = "chentong"; char* str2 = const_cast < char* > ( str ); int* p = reinterpret_cast < char* > ( str2 );
這樣就完成了類型的轉換。
接下來講一下動態類型轉換。首先得清楚的是,動態類型轉換,只能用于存在虛函數的類。假設我有三個類,
class Human { public: virtual void eating( void ) { cout << "use hand to eat" << endl; } }; class Englishman : public Human { public: //覆寫 void eating(void) { cout << "use knife to eat" << endl; } }; class Chinese : public Human { public: void eating(void) { cout << "use chopstick to eat" << endl; } };
然后我在global space中實現,對于不同國家的人有不同的吃飯方式這樣一個函數。
void test_eating(Human& h) { h.eating(); }
現在,我還想分辨這個人是英國人還是中國人。那么,我該怎么做呢?
void test_eating(Human& h) { Englishman* pe = NULL; Chinese *pc = NULL; h.eating(); if ( pe == dynamic_cast < Englishman* > ( &h ) ); cout << "this is Englishman" << endl; if ( pc == dynamic_cast < Chinese* > ( &h ) ) cout << "this is Chinese" << endl; }
在test_eating()函數中,我先定義兩個變量,分別指向Englishman*和Chinese類型。那么,它是如何動態轉換的呢?當一個類中有虛函數時,根據該類所創建的類對象中就會有一個指針,這個指針指向虛函數表,這個虛函數表中,含有類信息,根據這個類信息,就知道這個對象是屬于哪個類的。所以,這個類信息就可以確定Human& h的h,是哪個類的。
最后,靜態類型轉換static_cast<>在進行上行轉換時,是安全的。而在下行轉換時,沒有動態的檢查,所以是不安全的,只有你編寫代碼時去檢查是否符合邏輯。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。