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頁(參考:類型轉換運算符)