C での静的関数と非静的関数のオーバーロード
C では、同じ名前の静的関数と非静的関数をオーバーロードすることはできません。許可されています。これは C 標準で明示的に規定されており、戻り値の型のみが異なる関数、または関数の 1 つが静的である場合に名前とパラメーターの型が同じである関数のオーバーロードを禁止しています。
次のクラスを考えてみましょう:
<code class="cpp">class Foo { string bla; Foo() { bla = "nonstatic"; } void print() { cout << bla << endl; } static void print() { cout << "static" << endl; } };</code>
このクラス定義はもっともらしいように思えますが、C 標準によれば無効です。静的関数はオブジェクト メンバー アクセス (.) 構文を使用して呼び出すこともできるため、静的関数と非静的関数のオーバーロードはあいまいさにつながるため禁止されています。
たとえば、次のコード スニペットでは:
<code class="cpp">Foo f; f.print();</code>
静的印刷関数と非静的印刷関数のどちらを呼び出す必要があるかは不明です。
さらに、C には、関数が静的に呼び出されているかどうかを判断する方法がありません。 PHP のように。関数が呼び出されるオブジェクトを指す this キーワードは、常に null 以外になります。
要約
静的関数と非静的関数のオーバーロードC では同じ名前を持つことは許可されません。さらに、関数本体内で静的関数呼び出しと非静的関数呼び出しを区別するメカニズムはありません。
以上がC で静的関数と非静的関数をオーバーロードできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。