ホームページ >バックエンド開発 >C++ >C 関数は、非ポインター、非参照値型の定数だけに基づいてオーバーロードできますか?

C 関数は、非ポインター、非参照値型の定数だけに基づいてオーバーロードできますか?

DDD
DDDオリジナル
2024-11-17 03:35:03367ブラウズ

Can C   Functions be Overloaded based solely on the Constness of Non-Pointer, Non-Reference Value Types?

関数のオーバーロードと 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。