2013-07-31 60 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实例调用运营商的那个。