2010-06-02 5 views
5

Quelqu'un m'a récemment demandé la différence entre un opérateur standard C++ (par exemple new, delete, sizeof) et une fonction (par exemple tan, free, malloc). Par "standard", je veux dire ceux fournis par défaut par la suite du compilateur, et pas défini par l'utilisateur. Ci-dessous étaient les réponses que j'ai données, mais aucune ne semblait satisfaisante.Opérateurs vs fonctions en C/C++

(1) Un opérateur n'a pas besoin d'en-têtes à inclure pour l'utiliser: E.g. vous pouvez avoir un appel à nouveau sans inclure d'en-têtes. Cependant, une fonction (par exemple free()) nécessite des en-têtes inclus, obligatoirement. (2) Un opérateur est défini comme tel (c'est-à-dire comme opérateur de classe) quelque part dans les en-têtes standard. Une fonction n'est pas.

Pouvez-vous critiquer ces réponses et me donner une meilleure idée de la différence?

+0

est-ce que "supprimer" est utilisé intentionnellement dans les deux ensembles? – Sev

+0

Voir http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – nico

+0

Non, corrigé maintenant – PKG

Répondre

11

Les opérateurs sont mots-clés avec une syntaxe fixe. Ceux qui peuvent être surchargés peuvent varier un peu dans la syntaxe, mais c'est dans les limites. L'opérateur new est toujours orthographié new, même surchargé et la syntaxe d'invocation est toujours la même.

Les noms de fonction sont identificateurs, ce qui peut être presque arbitraire. Il n'y a aucune raison syntaxique que vous ne pouvez en finir avec malloc() et utiliser

bool my_fancy_alloc(void*& memory, unsigned char size, bool zero_it); 

à la place. (Mark: Il sont autres raisons, cependant.) Comme

+1

+1. Je suppose que la question est fausse au début (opérateurs vs fonctions?), Mais votre réponse en soulignant les mots-clés et les identifiants répond à tous. – paercebal

4

(1) n'est pas strictement vrai. typeid est un opérateur, mais son utilisation nécessite que vous incluiez <typeinfo>.

Ma réponse serait simplement que les opérateurs sont définis comme tels. :: ne doit pas nécessairement être considéré comme un opérateur, par exemple, mais la norme dit qu'il est, et il en est ainsi.

Si vous cherchez une réponse plus verbeuse, je voudrais continuer à mentionner que les opérateurs ne ressemblent généralement pas comme des fonctions. Et ceux qui le font [sizeof et typeid] n'agissent pas en tant que fonctions; leurs opérandes ne sont pas évalués lors de l'exécution.

+0

Merci. Mais qu'arrive-t-il aux opérateurs C purs (tels que +)? Ils ne peuvent pas être des opérateurs de classe, mais ils sont des opérateurs parce que la norme C le dit? – PKG

+0

@user: Je ne comprends pas ce que vous demandez. 'operator +' peut être surchargé pour les classes. –

2

Les opérateurs ont une syntaxe spéciale, par ex. vous pouvez utiliser new (ou +) sans mettre d'arguments entre parenthèses après le nom de l'opérateur.

0

à mon sens nom de la fonction est une représentation de l'opérateur goto, après avoir sauté à un emplacement de code spécifique application peut effectuer un à plusieurs d'autre part, un opérateur effectue une véritable unité de travail.

0

Un opérateur et une fonction sont conceptuellement identiques. Les deux prennent des valeurs en entrée et en retournent en sortie. Leur seule différence est là syntaxe.