Maison  >  Article  >  développement back-end  >  Pourquoi les fonctions statiques ne peuvent-elles pas être surchargées avec des fonctions non statiques en C ?

Pourquoi les fonctions statiques ne peuvent-elles pas être surchargées avec des fonctions non statiques en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-27 11:12:30740parcourir

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

Impossible de surcharger les fonctions statiques avec des fonctions non statiques en C

Alors que de nombreux langages de programmation permettent de surcharger des fonctions basées sur des méthodes statiques ou d'instance , C interdit explicitement ce comportement. La norme C 13.1/2 stipule que les fonctions membres portant le même nom et les mêmes types de paramètres ne peuvent pas être surchargées si l'une d'entre elles est statique.

<code class="cpp">class X {
    static void f();
    void f();
};</code>

Dans l'exemple ci-dessus, les deux déclarations de f() sont considérées mal formé par la norme.

Ambiguïté dans l'appel de fonctions statiques sur des instances

Même si la surcharge de fonctions était autorisée dans ce scénario, il y aurait toujours une ambiguïté lors de l'appel d'un fonction statique sur une instance. La norme C 9.4/2 permet aux membres statiques d'être appelés en utilisant à la fois l'identifiant qualifié (par exemple, X::f()) et la syntaxe d'accès aux membres de classe (par exemple, g().reschedule()). Ainsi, dans le code suivant, il n'est pas clair si la fonction print() statique ou non statique doit être appelée :

<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>

Vérifier si une fonction est appelée statiquement

Contrairement à PHP, où vous pouvez vérifier si la variable this est définie pour déterminer si une fonction est appelée de manière statique, C ne fournit pas cette fonctionnalité. Le mot-clé this pointe toujours vers un objet et n'est jamais NULL, vous ne pouvez donc pas l'utiliser pour faire la distinction entre les appels statiques et les appels d'instance.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn