2

通常、参照を返す関数の 2 つのバージョンが必要な理由がわかりません。たとえば、次のコードで:

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 参照のみを持つことの問題は何ですか?誰かが例を挙げてもらえますか?

ありがとう

4

3 に答える 3

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変更可能な char を返すオーバーロードを作成した場合、それはさらに悪いことです!

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

2 つのオーバーロードを追加しなければならないのはフラストレーションですが、通常、コードの 90% は ( で行ったように) 共有できるverify_indexか、2 行だけになってしまいます。

(const charを返す非constオーバーロードの4番目の組み合わせがありますが、それは無害でほとんど役に立たないので...ええ。)

于 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

あなたの例にはキーワードの2つのインスタンスがあり、インスタンスでconst演算子を呼び出すことができる2番目のものを無視しているようですconst

于 2013-07-31T19:34:12.607 に答える