1

重複の可能性:
リターンタイプによるオーバーロード

次のような3つのメンバー関数を宣言できないのはなぜですか。

  void x(int a);
  void x(String a); 
  int x(String a);

4

2 に答える 2

7

リターンタイプでオーバーロードできないからです。

void x(string a)

int x(string a)

同じ署名があります。署名は次のもので構成されています。

  • 関数名
  • パラメーター
  • cv-qualifiers

あなたの場合、これは同じです。

于 2012-05-17T14:14:07.347 に答える
3

C ++では、戻り型に基づいて関数をオーバーロードすることはできません。関数のオーバーロードは、引数のタイプに基づいてのみ許可されます。これは、オーバーロードルールに関する限り、とは同じ関数と見なされるvoid x(String a)ことを意味します。int x(String a)

紛らわしいかもしれない(しかしよく使われる)重要なケースの1つはconst、がメンバー関数の最後に置かれる場合です。それは次のようになりますint number_of_peanuts(bool tasty_only) const。つまりconst、このメンバー関数が含まれているクラスは、この関数では変更できないということです。

ただし、これは実際には引数型のオーバーロードの特殊なケースにすぎません。宣言されていないメンバー関数がある場合static、関数に追加された追加のパラメーター、このthisポインターが暗黙的にあります。これは、私が与えた関数の例がおおよそと同等であることを意味しint number_of_peanuts(Class const * this, bool tasty_only)ます。関数の最後にない場合はconst、代わりにのようになりますint number_of_peanuts(Class * this, bool tasty_only)

要約すると、引数のタイプと数だけがオーバーロードを可能にします。void x(int a)のように値を渡す場合const、コピーを変更するかどうかの違いを外部の世界が判断できないため、過負荷の機会は与えられません。参照を渡すか、ポインターを渡すconstと、オーバーロードオプションとして参照されているものを使用できます。これは、変更するかどうかを世界が判断できるため、異なりますvoid x(std::string & a)void x(std::string const & a)関数の最後に置くconstことは、過負荷の機会のもう1つの原因です。そして最後に、そして最も明白void x(int a)void x(int a, int b)ことですが、引数の数が異なるため、法的な過負荷になります。

于 2012-05-17T14:14:27.190 に答える