看stl源碼時,有一段代碼感受很奇怪node
iterator begin() { return (link_type)((*node).next); }
iterator和link_type是兩種不一樣類型,怎麼能這麼返回呢?翻了一下之前的筆記,發現是由轉換構造函數生成臨時對象再return。c++
轉換構造函數的做用是將某種類型的數據轉換爲類的對象,當一個構造函數只有一個參數,並且該參數又不是本類的const引用時,這種構造函數稱爲轉換構造函數。試驗了一下函數
class A { public: int a; A(int a) :a(a) {} A reta() { return a; } }; int main() { A a(2); A b = a.reta(); A c = 3; cout<<b.a<<"\n"<<c.a<<endl; return 0; }
結果是輸出2和3測試
實際上這是由隱式轉換機制形成的,若是不想要這種效果,能夠在構造函數前加上explicit聲明。加上以後上面的代碼就會編譯出錯,提示spa
沒法從「int」轉換爲「A」。code
既然能將數據轉換爲類型,類型也能轉換爲數據。c++的類型轉換函數能夠將一個類的對象轉換爲一個指定類型的數據。htm
class A { public: int a; A(int a) :a(a) {} operator int() { return a; } }; int main() { A a(2); int b = a + 3; A c = a + 4; cout<<b<<"\n"<<c.a<<endl; return 0; }
結果輸出5和6對象