C では静的関数を非静的関数でオーバーロードできないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-10-27 11:12:30
オリジナル
739 人が閲覧しました

Why Can't Static Functions Be Overloaded with Non-Static Functions in C  ?

C では静的関数を非静的関数でオーバーロードすることはできません

多くのプログラミング言語では、静的メソッドまたはインスタンス メソッドに基づいた関数のオーバーロードが許可されています, C ではこの動作を明示的に禁止しています。 C 標準 13.1/2 では、同じ名前とパラメーター型を持つメンバー関数は、いずれかが静的である場合はオーバーロードできないと規定されています。

<code class="cpp">class X {
    static void f();
    void f();
};</code>
ログイン後にコピー

上の例では、f() の 2 つの宣言が考慮されています。標準では不正な形式です。

インスタンスで静的関数を呼び出す際のあいまいさ

このシナリオで関数のオーバーロードが許可されていたとしても、関数を呼び出すときはあいまいさが残ります。インスタンスの静的関数。 C 標準 9.4/2 では、修飾 ID (X::f() など) とクラス メンバー アクセス構文 (g().reschedule() など) の両方を使用して静的メンバーを呼び出すことが許可されています。したがって、次のコードでは、静的 print() 関数と非静的 print() 関数のどちらを呼び出す必要があるかが不明瞭です:

<code class="cpp">class Foo {
    void print() { cout << "nonstatic" << endl; }
    static void print() { cout << "static" << endl; }
};

Foo f;
f.print(); // Ambiguous: static or non-static?</code>
ログイン後にコピー

関数が静的に呼び出されているかどうかを確認する

this 変数が定義されているかどうかをチェックして関数が静的に呼び出されるかどうかを判断できる PHP とは異なり、C にはこの機能がありません。 this キーワードは常にオブジェクトを指し、NULL になることはないため、静的呼び出しとインスタンス呼び出しを区別するために使用することはできません。

以上がC では静的関数を非静的関数でオーバーロードできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!