隱性轉型
強制轉型
不轉會CE(Compile Error)
亂轉會RE(Runtime Error)
本篇不保證於 visual studio 上適用
前言-為什麼有轉型,為什麼要轉型
電腦所做的一切都是人定出來的,你叫他做甚麼,他就做甚麼。電腦會自動幫你做的事情,是因為別人寫好了。別人沒寫,他就不知道怎麼做。
每個形態的處理方式、儲存方式不盡相同,需要轉換成另一個格式。
強制轉:
(type)(variable)
C++內另一種,運用constructor:type(variable)
隱性轉:
通常發生在 = 或 function傳值 或 運算時
例如:
int a=1;
double b=2;
a=a/b;
上面發生的事情依序是:
- a 從 int 轉為 double
- 計算 a/b 得 0.5
- 將 0.5 轉為 int 放進 a
例如:
void reversePrintString(const string &s)
{
for(unsigned x=s.size();x;) printf("%c",s[x-=1]);
}
reversePrintString("hello world");
上面發生的事情是:
(const char *) 呼叫 string 的 constructor 轉為 const string
還有更多隱性轉型等你發現(?)
unsigned + int,若 int 為負且絕對值大於 unsigned , cout 會印出甚麼? 例如
unsigned u=2;
int i=-3;
cout<<(u+i);
// 額外思考: printf 呢?
指標
轉型涵蓋指標,有幾件事一定要知道:
任何東西可以轉為void*
0可以直接轉指標沒問題
接著是指標轉型要注意的事項
想想看記憶體分配的時候,假設你的程式要了一塊空間(例如sizeof(unsigned)*1),並把它存進 unsigned *p; *p=1; ,請問: *((long long unsigned*)p) 會等於甚麼?
答案是 undefined (可能會跳 warning ,或是要求嚴格一點, Compile Error )
解釋:
sizeof(unsigned)<sizeof(long long unsigned)
存取到不見得有分配過的空間,系統可能不給你存取,造成 Runtime Error
如果存取成功,你也不知道會拿到甚麼內容 (即 undefined)
運用constructor轉型
舉例 string("aaaa");
又舉例
void f(string s){...}
f("aaaa");
#轉型一堆學問我哪打的完
#要想到打甚麼也很困難
#還是自行多練習,增廣見聞