c++轉換構造函數和類型轉換函數


  看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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM