C++類型轉換

   C語言中,存在強制類型轉換的概念。在C++中,C的作法一樣適用。可是,C++也有本身的類型轉換的方式,就是使用reinterpret_cast<>。例如,
安全

char* str = "chentong";
int* p = reinterpret_cast<int*>(str);

   經過這種方式,就把指向char*類型的str,強制轉換成了指向int*。
ide

   僅僅這樣作,是不夠的。由於,str指向的一個字符串,一個肯定的字符串,也就是說,要求是不可改寫,也就是可讀不可寫。因此,爲了達到這一目的,咱們將str指向的內容不可修改。操做以下:
函數

const char* str = "chentong";

   這樣作後,確實,str所指向的內容不可修改了,可是,這樣作,又帶來一個問題,那就是,reinterpre_cast<>這種強制轉換,不能夠去掉相似與const這樣的屬性。因此,咱們要經過一些手段,將str的const屬性去掉。幸運的是,C++確實提供瞭解決方案。經過const_cast<>。代碼以下:
this

const char* str = "chentong";
char* str2 = const_cast < char* > ( str );

   這樣一來,就去掉了str的const屬性。
spa

   那麼,完整的操做方式,
指針

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中實現,對於不一樣國家的人有不一樣的吃飯方式這樣一個函數。
it

void test_eating(Human& h) {

	h.eating();
}

   如今,我還想分辨這我的是英國人仍是中國人。那麼,我該怎麼作呢?ast

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<>在進行上行轉換時,是安全的。而在下行轉換時,沒有動態的檢查,因此是不安全的,只有你編寫代碼時去檢查是否符合邏輯。

相關文章
相關標籤/搜索