const 引数を持つ関数とオーバーロードを理解する
プログラミングでは、オーバーロードを使用すると、同じ名前でパラメーターが異なる複数の関数を同じ関数内に共存させることができます。クラス。ただし、非ポインター型、非参照型の定数に基づいてオーバーロードしようとすると、コンパイラ エラーが発生します。この記事では、この制限の背後にある理由と代替アプローチについて説明します。
次のコード部分を考えてみましょう:
class Test { public: Test() {} int foo(const int) const; int foo(int); };
このコードをコンパイルすると、コンパイラは関数 foo が使用できないことを示すエラーを発行します。過負荷になる。これは、非ポインター、非参照型の定数が関数のシグネチャに影響を与えないためです。上記の例では、両方の関数のシグネチャは同じです: int foo(int).
この制限が存在する理由を理解するには、次の状況を考慮してください。
Test obj; int variable = 0; obj.foo(3); // Calls the const function obj.foo(variable); // Intends to call the non-const function
ベースでオーバーロードが許可されている場合const の場合、コンパイラは obj.foo(variable) が呼び出されたときにどの関数を呼び出すかを決定できません。これは、値渡しの場合、値がコピーされ、const 指定は関数呼び出しとは無関係であるためです。
したがって、非ポインター、非参照型の定数に基づくオーバーロードは許可されません。 C で。別の方法として、異なる名前を持つ 2 つの別個の関数を作成することもできます。たとえば、
class Test { public: Test() {} int fooConst(const int); int fooNonConst(int); };
以上が非ポインタ、非参照型の「const」修飾子に基づいて関数をオーバーロードできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。