重複の可能性:
リターンタイプによるオーバーロード
次のような3つのメンバー関数を宣言できないのはなぜですか。
void x(int a);
void x(String a);
int x(String a);
?
重複の可能性:
リターンタイプによるオーバーロード
次のような3つのメンバー関数を宣言できないのはなぜですか。
void x(int a);
void x(String a);
int x(String a);
?
リターンタイプでオーバーロードできないからです。
void x(string a)
と
int x(string a)
同じ署名があります。署名は次のもので構成されています。
あなたの場合、これは同じです。
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)
ことですが、引数の数が異なるため、法的な過負荷になります。