2012-03-07 21 views
1
struct rowDisplayPolicy 
{ 
    static std::string seperator() { return ", "; } 
}; 

struct columnDisplayPolicy 
{ 
    static std::string seperator() { return "\n "; } 
}; 

template <typename T, int Size, typename DisplayPolicy> 
class Array { 
public: 
    Array() : pArray(new T[Size]) {} 
    Array(T* pT) : pArray(new T[Size]) 
{ 
    for(int i=0; i<Size; ++i) 
    *(pArray + i) = *(pT + i); 
} 
    ~Array() { delete [] pArray; } 
    T& operator[](int n) 
    { 
    if(n<0 || Size<=n) throw std::Exception("index out of range"); 
    return *(pArray+n); 
    } 
    T operator[](int n) const 
    { 
    if(n<0 || Size<=n) throw std::Exception("index out of range"); 
    return *(pArray+n); 
    } 
    void display() const 
    { 
    std::cout << "\n "; 
    for(int i=0; i<Size-1; ++i) 
     std::cout << *(pArray+i) << DisplayPolicy::seperator(); 
    std::cout << *(pArray+Size-1) << "\n"; 
    } 
private: 
    Array(const Array<T,Size,DisplayPolicy>&); // make public impl. Later 
    Array<T,Size,DisplayPolicy>& operator=(const Array<T,Size,DisplayPolicy>&); // ditto 
    T* pArray; 
}; 

私は質問があります、なぜ演算子[]は2つの異なる方法をオーバーロードします。そしてそれらの違いは何ですか?私は 'function()const'の意味を明確にしていません。いくつかの例を教えてください。演算子[]のオーバーロードはどのように機能しますか?

+2

なぜ、2番目のものはconst参照ではなくコピーを返しますか?そしてconstについては、それは簡単にGoogleが可能です。 – Corbin

答えて

1

メソッドのconstは、メソッドがオブジェクトの変更を許可できないことを意味します。
最初の演算子[]は、参照をnの要素に返します(したがって、配列の変更を許可します)。constのオブジェクトでは呼び出すことができませんでした。
2番目の演算子[]は、nの要素のコピーを返します。それは配列を変更するものではなく、constのオブジェクトに対して呼び出すことができます。 例:

Array<int, 10> my_array1(); 
int test1 = my_array1[0]; // Calls first operator[] 

const Array<int, 10> my_array2(); 
int test2 = my_array2[0]; // Calls second operator equals 

これはより頻繁に、それは関数は、配列を読むことができることを望んでいるが、変更しないので、配列がconstのように、それは多分資格をパラメータとして関数に渡されるコンテキストに適用されますそれ。

2

メンバ関数の暗黙のパラメータはthisで、末尾のconstは関数のオーバーロード解決に使用されます。これは次のように考えることができます:

void Array::function() -> void function(Array* this) 

void Array::function() const -> void function(Array const* this) 
関連する問題