挑戰(zhàn)30天C++入門極限:C++運(yùn)算符重載轉(zhuǎn)換運(yùn)算符

字號:

為什么需要轉(zhuǎn)換運(yùn)算符?
    我們大家知道對于內(nèi)置類型的數(shù)據(jù)我們可以通過強(qiáng)制轉(zhuǎn)換符的使用來轉(zhuǎn)換數(shù)據(jù),例如(int)2.1f;自定義類也是類型,那么自定義類的對象在很多情況下也需要支持此操作,C++提供了轉(zhuǎn)換運(yùn)算符重載函數(shù),它使得自定義類對象的強(qiáng)轉(zhuǎn)換成為可能。
    轉(zhuǎn)換運(yùn)算符的生命方式比較特別,方法如下:
    operator 類名();
    轉(zhuǎn)換運(yùn)算符的重載函數(shù)是沒有返回類型的,它和類的構(gòu)造函數(shù),析構(gòu)函數(shù)一樣是不遵循函數(shù)有返回類型的規(guī)定的,他們都沒有返回值。
    下面我看一個例子,看看它是如何工作的:
    C++ 代碼
    //例1
    //程序作者:管寧
    //站點(diǎn):www.cndev-lab.com
    //所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必出處和作者
    #include
    using namespace std;
    class Test
    {
     public:
     Test(int a = 0)
     {
     cout<     }
     Test(Test &temp)
     {
     cout<<"載入拷貝構(gòu)造函數(shù)!"<     Test::a = temp.a;
     }
     ~Test()
     {
     cout<a<     cin.get();
     }
     operator int()//轉(zhuǎn)換運(yùn)算符
     {
     cout<a<     return Test::a;
     }
     public:
     int a;
    };
    int main()
    {
     Test b(99);
     cout<<"b的內(nèi)存地址"<<&b<     cout<<(int)b<     system("pause");
    }
    在例子中我們利用轉(zhuǎn)換運(yùn)算符將Test類的對象強(qiáng)轉(zhuǎn)換成了int類型并輸出,注意觀察轉(zhuǎn)換運(yùn)算符函數(shù)的運(yùn)行狀態(tài),發(fā)現(xiàn)并沒有產(chǎn)生臨時對象,證明了它與普通函數(shù)并不相同,雖然它帶有return語句。
    在很多情況下,類的強(qiáng)轉(zhuǎn)換運(yùn)算符還可以作為類對象加運(yùn)算重載函數(shù)使用,盡管他們的意義并不相同,下面的例子,就是利用轉(zhuǎn)換運(yùn)算符,將兩個類對象轉(zhuǎn)換成int后,相加并創(chuàng)建臨時類對象,后再賦給另一個對象。
    代碼如下
    C++ 代碼
    //例2
    //程序作者:管寧
    //站點(diǎn):www.cndev-lab.com
    //所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必出處和作者
    #include
    using namespace std;
    class Test
    {
     public:
     Test(int a = 0)
     {
     cout<     }
     Test(Test &temp)
     {
     cout<<"載入拷貝構(gòu)造函數(shù)!"<     Test::a = temp.a;
     }
     ~Test()
     {
     cout<a<     cin.get();
     }
     operator int()
     {
     cout<a<     return Test::a;
     }
     public:
     int a;
    };
    int main()
    {
     Test a(100),b(100),c;
     cout<<"a的內(nèi)存地址"<<&a<<" | b的內(nèi)存地址"<<&b<     c=Test((int)a+(int)b);//顯示式轉(zhuǎn)換
     //c=a+b;//隱式轉(zhuǎn)換
     cout<<"c的內(nèi)存地址"<<&c<     cout<     system("pause");
    }
    代碼中的c=a+b;屬于隱式轉(zhuǎn)換,它的實(shí)現(xiàn)過程與c=Test((int)a+(int)b);完全相同。