//類型轉換;
//在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 可以參考