天天看點

每天一個C/C++知識點

作者:白天該睡覺

C++類型轉換分為兩種:顯示轉換和隐式轉換

  • 隐式轉換是指不需要人工幹預,編譯器自動進行的類型轉換的行為。特點:一般由低精度向高精度轉換
  • 顯示轉換是強制類型轉換,static_cast/dynamic_cast/const_cast/reinterpret_cast

const_cast

  1. 去除指針或引用的const屬性
  2. 轉化常量指針為非常量指針,且轉化後的指針仍然指向原對象
  3. 轉化常量引用為非常量引用,且轉化後的引用仍然指向原對象
  4. 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

  1. 沒有運作時類型檢查來保證轉換的安全性,存在一定的安全隐患
  2. 資料類型的轉換
  3. C++中的任何隐式轉換都可以通過static_cast來實作
  4. 不能夠轉換掉const,volatile
  5. 用于類層次間父類和派生類之間的指針或引用轉換,把派生類的指針或引用轉換成父類是安全的(上行轉換是安全的) 把基類指針或引用轉換成派生類是不安全的(下行轉換不安全)
#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

  1. 安全的上下行轉換,轉換失敗傳回NULL
  2. 須有虛函數
#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();
}