先上一段代碼, 這段代碼竟然可以編譯過,我的老天!
class Boo {
Boo(int c){ cout << "I’m Boo"; }
};
void do_something(Boo b) { }
int main() {
do_something(3);
}
照字面來理解,函數 do_something( ) 只能接受 Boo 型態的參數, 但是 compiler 看見 Boo 的構造函數後,自動來個隱式轉換,將 do_something(3)
轉成 do_something(B(3))
,於是編譯就通過了。C++竟然允許這樣子的事默默發生,我該說是聰明還是骯髒呢?
看見這個特性之後,我才驚覺原來之前這樣子寫行得通的原因就是構造函數隱式轉換
void foo( string kerker ) {
cout << kerker << endl;
}
int main() {
foo("KERKER");
}
因為foo("KERKER"); 被偷偷轉換為 foo(string("KERKER"));
實際上是這樣子阿,難怪 char* 跟 string 好像無接縫連接了一樣,不過我還是不喜歡這個特性。