C++中四種常用類型轉換運算符基本用法1(dynamic_cast、const_cast、static_cast、reinterpret_cast)

C++中常用的類型轉換運算符主要有四個,分別爲:dynamic_cast、const_cast、static_cast、reinterpret_cast,主要目的是爲了嚴格規範C語言的數據類型轉換,不會像C語言一樣鬆散(直接用小括號進行強制類型轉,如int a=(int)Float)。

下面將簡單介紹各個類型轉換運算符常用場景和基本實例。

一、dynamic_cast類型轉換運算符

1.1 dynamic_cast定義

dynamic_cast<type_name>(expression)

dynamic_cast的定義如上所示,在type_name中填入需要轉換的類型,在expression中填入被轉換的對象或表達式。

1.2 dynamic_cast常用場景

dynamic_cast一般用於基類指向派生類時強制轉換,如果轉換成功,則返回true,否則返回false。

1.3基本實例

#include <iostream>

class Base{};					//聲明和定義一個基類
class Derived : public Base{};	//聲明和定義一個派生類

void main()
{	
	Base* pb = new Base;			//基類指針
	Derived *pd = new Derived;		//派生類指針
	pb = dynamic_cast<Base *> (pd);	//派生類指針強行轉換爲基類指針,讓基類指針可以指向派生類,調用派生類函數(基類虛函數)
	
	return;
}

 

二、const_cast

2.1 const_cast定義

const_cast<type_name>(expression)

const_cast的定義如上所示,在type_name中填入需要轉換的類型,在expression中填入被轉換的對象或表達式。

2.2 const_cast常用場景

const_cast一般用於去掉const,修改被const修飾爲常量的值。但是修改的這個值本身不能是const常量,而是被二次引用或者傳參數時被引用爲const,才能修改,否則修改失敗。同時type和express兩個類型要一直才能去掉const,修改成功返回true,否則返回false。

2.3基本實例

#include <iostream>

class Base{};					//聲明和定義一個基類
class Derived : public Base{};	//聲明和定義一個派生類

void main()
{		
	Base ba;							//不能定義爲const Base ba;否則用const_cast修改失敗
	const Base *pba = &ba;

	Base *pb =const_cast<Base*> (pba);	//強行轉換pba爲非const

	return;
}

三、static_cast

3.1 static_cast定義

static_cast<type_name>(expression)

static_cast的定義如上所示,在type_name中填入需要轉換的類型,在expression中填入被轉換的對象或表達式。

3.2 static_cast常用場景

static_cast一般用於隱式轉換,當type_name和express至少有一方可以隱式轉換時,則可以用static進行強制類型轉換。可以用於常見的int、float等類型轉換;轉換成功返回true,否則返回false。(也就是一般C語言可以強制類型轉換的,都可以用static_cast替代)

3.3基本實例

#include <iostream>

class Base{};					//聲明和定義一個基類
class Derived : public Base{};	//聲明和定義一個派生類
class Other{};

void main()
{		
	Base ba;							
	Derived dr;

	Base *pb = static_cast<Base *> (&dr);		//有效的,向下轉換
	Derived *pd = static_cast<Derived *>(&ba);	//有效的,向上轉換;但是一般禁止這種轉換
	Other *po = static_cast<Base *> (&dr);		//無效轉換

	return;
}

四、reinterpret_cast

3.1 reinterpret_cast定義

reinterpret_cast<type_name>(expression)

reinterpret_cast的定義如上所示,在type_name中填入需要轉換的類型,在expression中填入被轉換的對象或表達式。

3.2 reinterpret_cast常用場景

reinterpret_cast一般用的比較少,常用於數據底層編程技術,比如同一片內存不同數據結構,把另一個字符串寫入該內存,則根據內存讀取對應數據,轉換成功返回true,否則返回false。

3.3基本實例

#include <iostream>

void main()
{		
	struct dat{ short a; short b; };
	long value = 0xAA110006;
	dat *pd = reinterpret_cast<dat *>(&value);
	std::cout << pd->a<<std::endl;

	system("pause");
	return;
}

 

 

參考內容:

《C++ Primer Plus》(第6版)中文版  649-652頁(參考:類型轉換運算符)

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