2015-11-19 70 views
4

我想寫一個字符串類。並希望使用下標訪問我的字符串中的元素。因此,我編寫了兩個成員函數,一個用於獲取字符串中的元素,另一個用於設置字符串中的元素。請看下面的代碼;如何在C++中重載訪問器和mutator運算符[]

#include <iostream> 
#include <algorithm> 

using namespace std; 

class String { 
public: 
    String(); 

    String(const char *s); 

    char &operator[] (int index); 
    char operator[] (int index) const; 

private: 
    char *arr; 
    int len; 
}; 

String::String() { 
    arr = new char[1]; 
    arr[0] = '\0'; 
    len = 0; 
} 

String::String(const char *s) { 
    len = strlen(s); 
    arr = new char[len + 1]; 
    std::copy(s, s + len + 1, arr); 
} 

//mutator operator[] ---> used to change data members; 
char& String::operator[](int index) 
{ 
    cout << "mutator []" << endl; 
    if (index > len || index < 0) 
     throw std::out_of_range("Index out of range"); 
    return arr[index]; 
} 
//Accessor operator[]---> used to read data members 
char String::operator[](int index) const 
{ 
    cout << "accessor []" << endl; 
    if (index > len || index < 0) 
     throw std::out_of_range("Index out of range"); 
    return arr[index]; 
} 

int main() 
{ 
    String s1 = "abc"; 

    s1[1] = 'b'; //---> should use mutator operator 
    String s2 = "efg"; 
    s2[1] = s1[2]; //---> should use both accessor and mutator operator 
    char a = s1[2]; //---> should use accessor operator 
    cout << s2[1] << endl; //---> should use accessor operator 
} 

當我運行此代碼。它的輸出全部是mutator;它使我困惑不已;

回答

6

讓我們看看這種情況下的視編譯器的點。我給你這個代碼:

String s2; 

/* things */ s1[2] /* things */ 

你選擇什麼功能?訪問者還是增變器?由於s2不是一個常量對象,我們來看看非常量版本!

這就是爲什麼你的代碼總是打印mutator,編譯器將不會選擇調用哪個函數,這取決於你對結果做什麼。無論您是否撥打char的分配操作員,

和你的const版本不應返回副本,而是一個const引用:

char& operator[](size_t index); 
const char& operator[](size_t index) const; 

你會得到一個編譯錯誤,而不是如果你試圖寫入一個常量字符串沒有賦值。

7

char operator[] (int index) const;只會在您有const String時纔會被調用。如果我們改變你的main()到:

int main() 
{ 
    const String s1 = "abc"; 
    char a = s1[2]; //---> should use accessor operator 
} 

它將ouptut:

accessor [] 

Live Example