C++ 學習(一)類型轉換

http://www.cppblog.com/yearner/archive/2008/05/20/50457.html

 

1.類型轉換按方式分爲隱式轉換和顯式轉換。
        隱式轉換:由編譯器自動完成,無需用戶干預。
        顯式轉換:採用一定的形式進行轉換:類型名(數據) / C中(類型名)數據
2.關於轉換構造函數
        構造函數的一種,主要用於類型轉換,格式嚴格規定爲單參數構造函數。
        例:Complex類
             Complex(double r){Real=r;imag=0;}  int(double r);
             Complex a;
              a=2.4; 相當於a=Complex(2.4);
         編譯器如果發現語法有問題,會檢查是否存在轉換構造函數,有,則隱式轉換。
 3.關於類型轉換函數
         轉換構造函數是將一種數據類型轉換成類對象。如果編譯器發現需要將類轉換成某種數據類型,那該怎麼辦?
         類型轉換函數的一般形式:operator 類型名(){轉換函數的實現}
        沒有函數類型,沒有參數。
         例:
     #include<iostream>
     using namespace std;
      class Complex
      {
        public :
         Complex(){real=0;imag=0;}
         Complex(double r,double i){real=r;imag=i;}
          operator double(){return real;}
          private:
           double real;
           double imag; 
       };
       int main()
    {
         Complex c1(3,4),c2(5,-10),c3;
         double d;
         d=2.5+c1;
         cout<<d<<end1;
         return0;
    }
     d=2.5+c1;
     由於類成員沒有對運算符+重載,所以2.5與c1無法直接向加。編譯器發現存在類型轉換函數,故將 隱式調用double(), c1轉換爲 double 型3,並將該結果存放在臨時變量裏。運算d=2.5+3得到結果。
 若主函數中有c3=2.5+c1;如果沒有運算符+的重載,編譯器會出錯。當 運算符重載函數作爲類成員出現時,編譯器會理解爲c3=2.5.operator +(c1);由於2.5非complex類,這種解析編譯器也會出錯。對於c3=c1+2.5的格式,編譯器會正確處理。
 這種情況使用戶不能方便的使用交換率,爲了改變這一不便,需要將重載函數作爲友元函數而不是類成員函數。(雙目運算符的重載一般都採用友元函數的方式)
 friend Complex operator +(Complex c1,complex c2);
    在函數體外定義:
 Complex operator +(Complex c1,complex c2);
  {return Complex (c1.real +c2.real,c1.imag+c2.imag);}
這樣,對於c3=2.5+c1;(需要增加轉換構造函數)編譯器在遇到+號時,會搜索+兩端的數據並引用友元的運算符重載函數,其形式變爲:c3=operator+(2.5,c1); 而參數定義都是Complex對象,因此,隱式調用轉換構造函數,形式變爲:c3=operator+(Complex (2.5),c1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章