C++類型轉換

//類型轉換;

//在C語言中有兩種轉換方式:隱式轉換,顯示轉換(強制類型轉換);
/*
//強制類型轉換;
double f = 1.2f;
int n = (int)f;
char* p = (char*)malloc(1024);//malloc一般返回的是void*類型;
*/

//C++的類型轉換;
/*
常見的幾種方式;

1、靜態類型轉換:static_cast<類型>(變量);
需要編譯器對類型轉換安全性進行檢查,或者將void* 轉換成具體類型的指針;
任何類型的指針都可以通過隱式類型轉換轉成void*,但是void*轉換成其它類型時需要顯示轉換;
靜態轉換是編譯器在編譯時就已經確定的,由編譯器去完成;
*/
/*
#include <iostream>
using namespace std;
void main(void)
{
	double f = 1.2f;
	int n = static_cast<int>(f);
	cout<<f<<endl;
	cout<<n<<endl;
	char* p = "hello";
	//n = static_cast<int>(p);	//編譯錯誤;
	//n = (int)p;		//不報錯;
	//cout<<"ERROR: "<<n<<endl;
	system("pause");
	return ;
}

//這樣可以避免失誤造成的錯誤,編譯器如果發現類型轉換有風險,就會報錯提示;
//靜態類型轉換的成功條件是:在源類型和目標類型之間,只要有一個方向上可以做隱式類型轉換,那麼兩個方向上就都可以做靜態類型轉換;
*/

/*
2、動態類型轉換:dynamic_cast<類型>(變量);
用於在具有多態特性的父子類之間的轉換;(未完待續,以後再補充)
*/

/*
3、常量類型轉換:const_cast<類型>(變量);
用於去除指針或者引用上的const屬性;
const指針或引用的意義在於他所指向的內容是不能被修改的;而常量類型轉換是把不能被修改的轉換爲可以被修改的;
*/
/*
#include <iostream>
using namespace std;
void main(void)
{
	const int cn = 5;
	//cn = 10;	//報錯,常量是不能賦值的;
	
	//嘗試用地址的方式修改;
	int* pn = const_cast<int*>(&cn);	//cn的地址是const int*,需要去掉const屬性;
	*pn = 20;
	cout<<cn<<endl<<*pn<<endl;		//5,20;
	system("pause");
	return ;
}

//執行發現cn的值並沒有改變,因爲編譯器在編譯時,會把const類型的目標從內存移動到寄存器中;
//所以當我們通過地址修改值時,只是修改了內存中的值,並沒有訪問寄存器中的值,所以cn的值不會改變;
//如果強制修改寄存中的const值,可以使用volatile關鍵字,目的是不讓編譯器進行內存優化。告訴編譯器,這個值是易失的,易變的;
const volatile int cn = 5;	//關閉寄存器優化;
*/

/*
4、重解釋類型轉換:reinterpret_cast<類型>(變量);
允許對任意類型的指針進行轉換;不會對類型相容性進行檢查,只是對兩個變量之間進行賦值;
用於在指針和其它類型之間進行轉換;
*/
/*
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
struct Person
{
	char name[128];
	int age;
};
void main(void)
{
	char* p = "hello";
	int n = reinterpret_cast<int>(p);
	cout<<p<<endl<<n<<endl;

	double * pf = reinterpret_cast<double*>(p);
	cout<<pf<<endl;

	//例如查看一個指針的值;
	printf("%p\n",p);
	//十進制顯示;
	printf("%d\n",p);	//做了一個類型轉換;

	cout<<endl<<endl<<endl;

	Person boy = {"Simon",25};
	ofstream ofs ("T.dat");		//.dat是一個二進制文件;(未完待續,以後補充)
	ofs.write(reinterpret_cast<char*>(&boy),sizeof(boy));
	ofs.close();

	//例如用於從服務器接受數據包並解析;
	char* data = "20150628";
	struct Date
	{
		char year[4];
		char month[2];
		char day[2];
	};
	Date* today = reinterpret_cast<Date*>(data);
	cout<<today->year<<"-"<<today->month<<"-"<<today->day<<endl;
	// 20150628-0628-28	因爲結構體開闢的是一塊連續的空間,雖然按照定義的字符數組大小截取字符,但值是上一次截取後的剩餘值;

	system("pause");
	return ;
}
*/


 關於reinterpret_cast 可以參考

http://www.cnblogs.com/ider/archive/2011/07/30/cpp_cast_operator_part3.html

 

發佈了21 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章