我不明白为什么我们通常需要两个版本的函数来返回引用 - 一个是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];
}
如果我们只有const,那么我们就无法做到例如str [i] = value。但是只有非const引用有什么问题,有人可以举个例子吗?
由于
答案 0 :(得分:3)
如果您只有非持续超载,则无法在[]
字符串上使用const
synax。
void print_first(const std::string& word) {
std::cout << word[0]; //like this
}
如果您只有const
重载,则无法使用[]
语法修改字符串:
void edit_first(std::string& word) {
word[0] = 'a';
}
如果你做了一个const
重载,它会返回一个可变的char,那就更糟了!
void edit_first(const std::string& word) {
word[0] = 'a'; //wait, I thought word was const?
}
令人沮丧的是,您必须添加两个重载,但通常可以共享90%的代码(就像您对verify_index
所做的那样),或者它们最终只是两行。
(有一个第四个组合的nonconst重载返回一个const char,但这是无害的,而且几乎没用,所以......是的。)
答案 1 :(得分:1)
const String s = "abc";
cout << s[0]; // Ooops! Cannot run operator[] because no const qualifier.
答案 2 :(得分:0)
您的示例中有const
个关键字的两个实例,您似乎忽略了第二个关键字,即允许您在const
实例上调用运算符的实例。