C ++中运算符返回的引用和const引用

时间:2013-07-31 19:30:40

标签: 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];
}

如果我们只有const,那么我们就无法做到例如str [i] = value。但是只有非const引用有什么问题,有人可以举个例子吗?

由于

3 个答案:

答案 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实例上调用运算符的实例。