C++類型轉換分為兩種:顯示轉換和隐式轉換
- 隐式轉換是指不需要人工幹預,編譯器自動進行的類型轉換的行為。特點:一般由低精度向高精度轉換
- 顯示轉換是強制類型轉換,static_cast/dynamic_cast/const_cast/reinterpret_cast
const_cast
- 去除指針或引用的const屬性
- 轉化常量指針為非常量指針,且轉化後的指針仍然指向原對象
- 轉化常量引用為非常量引用,且轉化後的引用仍然指向原對象
- const_cast<要轉換的類型>(要轉換的對象)
#include<iostream>
int main()
{
const int a = 100;
int &b = const_cast<int&>(a);
int *ptr = const_cast<int*>(&a);
std::cout << "&a=" << &a << std::endl;
std::cout << "&b=" << &b << std::endl;
std::cout << "*ptr=" << ptr << std::endl;
std::cin.get();
return 0;
}
static_cast
- 沒有運作時類型檢查來保證轉換的安全性,存在一定的安全隐患
- 資料類型的轉換
- C++中的任何隐式轉換都可以通過static_cast來實作
- 不能夠轉換掉const,volatile
- 用于類層次間父類和派生類之間的指針或引用轉換,把派生類的指針或引用轉換成父類是安全的(上行轉換是安全的) 把基類指針或引用轉換成派生類是不安全的(下行轉換不安全)
#include<iostream>
using namespace std;
class base {
};
class driver :public base
{
};
int main()
{
double f_pi = 3.14;
int i_pi = static_cast<int>(f_pi);
cout << f_pi << " " << i_pi << endl;
driver driver;
base *b = static_cast<base *>(&driver);
cin.get();
return 0;
}
dynamic_cast
- 安全的上下行轉換,轉換失敗傳回NULL
- 須有虛函數
#include<iostream>
using namespace std;
class base
{
public:
base(){}
virtual void print() {
cout << "base print" << endl;
}
};
class driver:public base
{
public:
driver():base(){}
virtual void print() {
cout << "driver print" << endl;
}
};
int main()
{
driver dr;
base *ba = dynamic_cast<base*>(&dr);
base bb;
driver *db = dynamic_cast<driver*>(&bb);
if (db == nullptr) {
cout << "nullptr" << endl;
}
else {
db->print();
}
ba->print();
cin.get();
}
reinterpret_cast
允許将任何指針轉換為任何其他指針類型,也允許将任何整數類型轉換為任何指針類型以及反向轉換。
#include<iostream>
using namespace std;
int main()
{
int *p_a = new int[5];
cout << hex << p_a << endl;
int p_i = reinterpret_cast<int>(p_a);
cout << hex << p_i << endl;
delete [] p_a;
p_a = nullptr;
cin.get();
}