C++中的類型轉(zhuǎn)換
顯示轉(zhuǎn)換
命名的強制類型轉(zhuǎn)換
- static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
cast-name<type>(expression)
//其中type是轉(zhuǎn)換的目標類型脱拼,expression是要轉(zhuǎn)換的值
//castname是上表所列的4個轉(zhuǎn)換類型名中的一種
static_cast
任何具有明確定義的類型轉(zhuǎn)換,只要不包含底層const坷备,都可以使用static_cast熄浓。
int i,j;
double slope = i/j;
double slope = static_cast<double>(j)/i;//強制轉(zhuǎn)換以便執(zhí)行浮點除法。
當一個較大的算術類型轉(zhuǎn)換成一個較小的算術類型省撑,如果沒有使用static_cast 就會顯示警告赌蔑,使用static_cast警告就消失了,因為編譯器已經(jīng)默認接受可能出現(xiàn)的精度損失竟秫。
static_cast對于編譯器無法自動執(zhí)行的類型轉(zhuǎn)換也非常有用惯雳。
void *p = &d;
double *dp = static_cast<double* >(p);
const_cast
const_cast 只能改變運算對象的底層const
const char *pc;
char *p = const_cast<char*>(pc);
如果對象本身不是一個常量,使用強制類型轉(zhuǎn)換獲得寫的權限是合法的行為鸿摇,然而如果對象是一個常量石景,再使用const_cast執(zhí)行寫操作就會產(chǎn)生未定義的后果。
reinterpret_cast
reinterpret_cast 通常為運算對象的位模式提供較低層次上的重新解釋拙吉。
int *ip;
char *pc = reinterpret_cast<char *>(ip);
我們必須牢記pc所指的真實對象是一個int而非字符潮孽,如果把pc當成普通的的字符串指針使用就可能在運行時發(fā)生錯誤。
string str(pc); //會發(fā)生錯誤。
當我們用一個int的地址初始化pc時,由于顯式的聲稱這種轉(zhuǎn)化合法骄噪,所以編譯器不會發(fā)出任何警告或錯誤信息。
const的分層問題
頂層const
用名詞頂層const(top-level const)表示指針本身是個常量椎例,而用名詞底層const(low-level const)表示指針所指對象是一個常量挨决。
更一般的,頂層const可以表示任意的對象是常量订歪。
底層const則與指針和引用等復合類型的基本類型部分有關脖祈。
指針類型既可以是頂層const又可以是底層const
int i = 0;
int* const p1 = &i; //不能改變p1的值是一個頂層const
const int ci = 42; //不能改變ci的值是一個頂層const
const int *p2 = &ci; //可以改變p2的值是一個底層const
const int *const p3 = p2刷晋; //靠右邊的是頂層const盖高,靠左邊的是底層const
const int &r = ci; //r 是底層const
底層const的限制不能忽視眼虱,當執(zhí)行對象的拷貝操作時喻奥,拷入拷出的對象必須有相同的底層const資格∧笮或者兩個對象的數(shù)據(jù)類型必須能夠轉(zhuǎn)換撞蚕,非常量可以轉(zhuǎn)換成常量,反之則不行过牙。
int *p = p3; //p沒有底層const的資格诈豌,不能進行。
p2 = p3; //p2,p3均有底層const的資格
p2 = &i; //正確抒和,int* 能轉(zhuǎn)換成const int*
int &r = ci; //普通的int & 不能綁定在 int 常量上。
const int &r2 = i; //const int & 可以綁定到一個普通int 上彤蔽。