関数のオーバーロードと const 引数: 詳細
C では、関数のオーバーロードにより、同じ名前の複数の関数をクラス内に存在させることができます。パラメータのタイプが異なる限り。ただし、非ポインター、非参照値型の定数のみに基づいて関数をオーバーロードしようとすると、状況が発生します。
次のコード スニペットを考えてみましょう。
#include <iostream> using namespace std; class Test { public: int foo(const int) const; int foo(int); }; int main () { Test obj; Test const obj1; int variable=0; obj.foo(3); // Call the const function obj.foo(variable); // Want to make it call the non const function }
上記ではコードでは、引数の定数に基づいて foo 関数をオーバーロードしようとします。ただし、コンパイラは、この方法では関数のオーバーロードを実行できないことを示すエラーをスローします。
制限について
この制限の理由は、メソッドの値にあります。タイプが扱われます。値が関数に値渡しされると、値のコピーが作成され、関数内でこのコピーに加えられた変更は元の値に影響しません。したがって、引数の定数は関数のスコープ内でのみ関係します。
たとえば、foo 関数の場合:
int Test::foo(int a) { cout << "NON CONST" << endl; a++; return a; }
関数に const キーワードがなくても、 a の値は、関数に渡された元の値のコピーであるため、変更できません。
解決策
必要な機能を実現するには、オーバーロードできます。さまざまなパラメータタイプに基づく foo 関数。たとえば、int への const 参照と int への非 const 参照を受け入れるように foo をオーバーロードすることができます。
#include <iostream> using namespace std; class Test { public: int foo(const int &a) const; int foo(int &a); }; int main() { Test obj; Test const obj1; int variable = 0; obj.foo(3); // Call the const function obj.foo(variable); // Call the non-const function }
このアプローチでは、パラメータの型に基づいてオーバーロードできると同時に、パラメータに関して望ましい動作を維持できます。 const-correctness.
以上がC 関数は、非ポインター、非参照値型の定数だけに基づいてオーバーロードできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。