2014-02-16 68 views
2

有人可以ewxplain我的編譯器是如何調用操作鑄造:編譯器如何調用運算符強制轉換?

operator ELEMENT()const { 
return pArray->arr[index]; 
} 

從6號線在主:

(*ptr3)[0] = a1[0] + a2[1]; 

如何添加具有+運算符將兩個元素對象甚至不允許? ELEMENT類中沒有+運算符重載。

感謝, Liron

#include <iostream> 

using namespace std; 

template<class ELEMENT> class Array 
{ 
    class Element 
    { 
     Array<ELEMENT>* pArray; 
     int index; 
    public: 
     Element(Array<ELEMENT>* p, int i) 
      : pArray(p), index(i) {} 
     const Element& operator=(const ELEMENT& e) { 
      pArray->set(index, e); // call copy-on-write 
      return *this; 
     } 
     operator ELEMENT()const { 
      return pArray->arr[index]; 
     } 
    }; 
     friend class Element; 
    ELEMENT* arr; 
    int size; 
    int* ref_counter; 
    void attach(const Array& a) { 
     arr = a.arr; size = a.size; 
     ref_counter = a.ref_counter; 
     ++(*ref_counter); 
    } 
    void detach() { 
     if(--(*ref_counter) == 0) { 
      delete []arr; 
      delete ref_counter; 
     } 
    } 
    void set(int index, const ELEMENT& e) { 
     if(*ref_counter > 1) { // need copy-on-write! 
      Array temp = clone(); 
      detach(); 
      attach(temp); 
     } 
     arr[index] = e; 
    } 
public: 
    explicit Array(int); 
    Array<ELEMENT> clone()const; 
    Array(const Array<ELEMENT>& a){attach(a);} 
    ~Array(){detach();} 
    const Array& operator=(const Array<ELEMENT>& a) { 
     detach(); attach(a); return *this; 
    } 
    Element operator[](int index) { 
     return Element(this, index); 
    } 
    const ELEMENT& operator[](int index)const { 
     return arr[index]; 
    } 
}; 
template<class ELEMENT> 
Array<ELEMENT>::Array(int size1) 
    : size(size1), ref_counter(new int(1)) 
{ 
    arr = new ELEMENT[size]; 
} 
template<class ELEMENT> 
Array<ELEMENT> Array<ELEMENT>::clone()const { 
    Array temp(size); 
    for(int i=0; i<size; ++i) { 
     temp.arr[i] = arr[i]; 
    } 
    return temp; 
} 
int main() 
{ 
    Array<int> a1(1), a2(2); 
    Array<int>* ptr3 = new Array<int>(3); 
    a2[0] = 1; 
    a2[1] = 2; 
    a1 = a2; 
    (*ptr3)[0] = a1[0] + a2[1]; 
    (*ptr3)[1] = a1[1] + a2[0]; 
    cout << (*ptr3)[0] << ", " << (*ptr3)[1] << endl; 
    delete ptr3; 
    return 1; 
} 

回答

2

如何添加具有+運算符將兩個元素對象甚至不允許? ELEMENT類中沒有+運算符重載。

ELEMENT不是一個類,它是一個類型參數。在你的例子中,該參數的類型是int。很明顯,int確實有一個+運算符,所以工作正常。如果您嘗試創建Array<SomeType>,其中SomeType沒有+運算符,則會出現錯誤。

有一個Element類和類確實沒有+操作,但類(在這種情況下,即int)隱式轉換爲ELEMENT,所以當你申請+Element的對象,編譯器增加了通話轉換運算符並將+應用於結果。