2

我不明白为什么我们通常需要两个版本的返回引用的函数——一个是 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。但是只有非常量引用有什么问题,有人可以举个例子吗?

谢谢

4

3 回答 3

3

如果您只有非常量重载,您将无法在字符串上使用[]语法。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,但这是无害的,而且大多是无用的,所以......是的。)

于 2013-07-31T19:33:44.100 回答
1
const String s = "abc";

cout << s[0]; // Ooops! Cannot run operator[] because no const qualifier.
于 2013-07-31T19:33:05.693 回答
0

您的示例中有两个const关键字实例,您似乎忽略了第二个实例,它允许您在const实例上调用运算符。

于 2013-07-31T19:34:12.607 回答