1

C++ での大括弧のオーバーロードに関して、私のコンパイラはアクセスに mutator メソッドを使用しています。誰でも理由を教えてもらえますか?

1. const int & Cheese::operator [] (int i)const { return weight[i]; } //accessor
2. int & Cheese::operator [] (int i) { return weight[i]; } //mutator

たとえば、以下の cout コマンドはミューテーター関数の定義 (上記の #2) を使用してデータにアクセスしています。

Cheese cheddar;
cout << cheddar[2] << endl;

データを取得するために最初の関数 (アクセサ) を使用しないのはなぜですか? cout は単なる検索なので、最初に発火すると思います。

コンパイラは、これらのどれを呼び出すべきかをどのように認識しますか?

編集:完全を期すために、ミューテーターとは、次のように「セッター」として使用されることを意味します。

cheddar[2] = 100;

両方を組み合わせると、次のようになります。

cheddar[2] = cheddar[1];

rhs は単なる「ゲッター」です。単純にcheddar[1]の値を取得し、何も変更しないため、const にすることができます。対照的に、lhs ブラケット オーバーロードcheddar[2]は「セッター」として機能します。値は変更でき、関数の戻り値を const にすることはできません。

4

2 に答える 2

5

定数インスタンス (const Cheeseまたは などconst Cheese&) に対して最初のものを呼び出し、変更可能なインスタンスに対して 2 番目のものを呼び出します。

于 2015-11-25T23:13:52.870 に答える