看stl源碼時,有一段代碼感覺很奇怪
iterator begin() { return (link_type)((*node).next); }
iterator和link_type是兩種不同類型,怎么能這么返回呢?翻了一下以前的筆記,發現是由轉換構造函數生成臨時對象再return。
轉換構造函數的作用是將某種類型的數據轉換為類的對象,當一個構造函數只有一個參數,而且該參數又不是本類的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聲明。加上之后上面的代碼就會編譯出錯,提示
無法從“int”轉換為“A”。
既然能將數據轉換為類型,類型也能轉換為數據。c++的類型轉換函數可以將一個類的對象轉換為一個指定類型的數據。
類型轉換函數的一般形式為 :
operator
類型名()
{實現轉換的語句}
測試代碼:
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