91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++類型轉換

發布時間:2020-06-28 12:20:19 來源:網絡 閱讀:455 作者:BarnabyRoss 欄目:編程語言

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广西| 衢州市| 泌阳县| 论坛| 于都县| 德兴市| 申扎县| 六枝特区| 丰都县| 来安县| 宿迁市| 华阴市| 汶上县| 黎城县| 屯昌县| 松滋市| 乌兰县| 香港| 昌宁县| 宁波市| 沙坪坝区| 油尖旺区| 浦东新区| 西和县| 绥中县| 辰溪县| 绵阳市| 宜宾市| 祁东县| 东辽县| 宜兰市| 丹寨县| 普兰县| 当阳市| 迁西县| 布尔津县| 峨眉山市| 宿迁市| 阿克陶县| 梅州市| 青阳县|