2013-07-31 106 views
2

我不明白爲什麼我們通常需要兩個返回引用的函數版本 - 一個是const,另一個不是。 例如,在此代碼:從C++運算符返回的引用和const引用

const char& String::operator[](int index) const { 
    verify_index(index); 
    return data[index]; 
} 

char& String::operator[](int index) { 
    verify_index(index); 
    return data[index]; 
} 

如果我們只有常量,那麼我們就無法例如海峽辦[I] =價值。但是,只有非const引用有什麼問題,有人可以舉個例子嗎?

感謝

回答

1
const String s = "abc"; 

cout << s[0]; // Ooops! Cannot run operator[] because no const qualifier. 
3

如果你只有一個非const超載,你將無法使用[] synax上const字符串。

void print_first(const std::string& word) { 
    std::cout << word[0]; //like this 
} 

如果你只有const超載,你將無法使用[]語法修改字符串:

void edit_first(std::string& word) { 
    word[0] = 'a'; 
} 

如果你犯了一個const超載返回一個可變的字符,這是連更差!

void edit_first(const std::string& word) { 
    word[0] = 'a'; //wait, I thought word was const? 
} 

這是你必須添加兩個重載一種無奈,但通常是90碼的%可以共享(如您verify_index所做的那樣),或者他們最終會被短短兩年的俏皮話。

(有是返回一個const char一個非const超載的第四組合,但這是無害的,大多無用所以...是啊。)

0

有該關鍵字const的兩個實例在你的榜樣,你似乎忽略了第二個,即允許您通過const實例調用運營商的那個。