四種cast轉換

1、const_cast

用於修改const指針指向的值

形式:const_cast <type> (expression) 
    

void Test_const_cast()
{
	int num = 10;//若num爲const時,則無法修改num的值
	const int* p = &num;
	//*p = 12;不可改
	int* n = const_cast<int*>(p);
	*n = 11;
	cout << num << '\t' << *p << endl;//num = 11, *p = 11
}

2、static_cast

用於各種隱式轉換,比如非const轉const,void*轉指針等, static_cast能用於多態向上轉化,如果向下轉能成功但是不安全,結果未知;

void Test_static_cast()
{
	int num = 10;
	int* p = &num;
	const int* n = static_cast<int*>(p);
	//*n = 11;不可修改
	cout << num << '\t' << *n << endl;
}

3、dynamic_cast

用於動態類型轉換。只能用於含有虛函數的類,只能向上轉換。

向上轉換:指的是子類向基類的轉換

向下轉換:指的是基類向子類的轉換

class Father
{
public:
	Father():a(10)
	{}
	virtual void Fun()
	{
		cout << "父類" << endl;
	}

private:
	int a;
};

class Son:public Father
{
public:
	Son():a(12)
	{}
	void Fun()
	{
		cout << "子類" << endl;
	}
	
private:
	int a;
};

void Test_dynamic_cast()
{
	Son* son = new Son;
	Father* fa = dynamic_cast<Father*>(son);
	fa->Fun();//調用子類函數
	
	/*Father fa1;
	Father& fa2 = fa1;
	Son& son1 = dynamic_cast<Son&>(fa2);
	son1.Fun();拋出異常*/
	
	Father* fa1 = new Father;
	Son* son1 = dynamic_cast<Son*>(fa1);//son1是空指針
	son1->Fun(); 
	delete[] son;
	delete[] fa1;
	son = NULL;
	fa1 = NULL;
}

4、reinterpret_cast

幾乎什麼都可以轉,比如將int轉指針,可能會出問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章