3

私はこのコードをC++で書きました:

class Foo
{
public:
    int& fun(){return var;}       // 1st fun
    int fun() const {return var;}  // 2rd fun
 private:
    int var;
};
int main()
{
    Foo foo;
    int i = foo.fun();
    return 0;
}

C ++は戻り値でオーバーロード関数を区別できないことは知っていますが、2番目の関数にconstを追加したときに、オーバーロードが機能するのはなぜですか?'const'は何をしましたか?

4

3 に答える 3

6

コンパイラは、割り当てが実行される前に戻り値が変換される可能性があるため、戻りタイプで区別できません。一方、関数が呼び出されるオブジェクトは、関数のパラメーター(暗黙的なパラメーターではありますが)であるため、コンパイラーはそれを識別できます。

于 2012-08-11T02:05:43.583 に答える
2

Constは次のように使用されます。

Foo inst1;
const Foo inst2;

inst1.fun();    // 1st fun
inst2.fun();    // 2nd fun

関数名の後のConstは、暗黙のthisパラメーターを参照します。したがって、inst1の場合は、inst2の場合はそうなりFoo*ますconst Foo*。これは過負荷を導きます。

戻り値は、過負荷の選択には使用されません。同じパラメータのセットと異なるタイプの戻り値を持つメソッド/関数は、同じレイヤーでは許可されていません。

于 2012-08-11T02:04:47.263 に答える
1

それが価値があるものについては、標準(§13.3.1/ 3,4)からの言語:

同様に、必要に応じて、コンテキストは、操作対象のオブジェクトを示す暗黙のオブジェクト引数を含む引数リストを作成できます。引数とパラメーターはそれぞれのリスト内の位置によって関連付けられるため、暗黙のオブジェクトパラメーターが存在する場合は常に最初のパラメーターであり、暗黙のオブジェクト引数が存在する場合は常に最初の引数であるという規則があります。

非静的メンバー関数の場合、暗黙的なオブジェクトパラメータのタイプは次のとおりです。

— ref-qualifierなしまたは&ref-qualifierありで宣言された関数の「cvXへの左辺値参照」

— && ref-qualifierで宣言された関数の「cvXへの右辺値参照」。ここで、Xは関数がメンバーであるクラスであり、cvはメンバー関数宣言のcv修飾です。[例:クラスXのconstメンバー関数の場合、追加のパラメーターは「constXへの参照」タイプであると想定されます。—例を終了]

于 2012-08-11T02:12:39.190 に答える