La différence entre l'opérateur et la fonction en C++?
Je pourrais utiliser un peu d'aide pour comprendre la suite en C++, en particulier la différence entre un opérateur et une fonction:
- Ce qui est un opérateur?
- Qu'est ce qu'une fonction?
- Quelle est la différence entre eux?
- Est définie par l'utilisateur
operator+()
un fonction ou un opérateur? - Un opérateur peut-il fonctionner sur des opérandes au moment de la compilation? Ils ne fonctionnent toujours au moment de la compilation? (comme
sizeof()
en C++)
Vous devez vous connecter pour publier un commentaire.
Un opérateur est un symbole comme
+
,-
,+=
et ainsi de suite (voir 13.5). Ils ne portent pas de sens. Au cours de l'analyse sémantique, la signification d'un opérateur est déterminé.Une fonction est un constructeur, un destructeur, fonction de conversion (qui ressemble à
operator type()
) ou l'opérateur de la fonction (la fonction de modèle de la spécialisation et de l'instanciation peut produire à leur tour, ces).Un fonction opérateur est quelque chose que implémente un opérateur (voir 13.5). Un exemple est
operator+
. Ces fonctions sont, à tous égards, et que la seule différence de "d'habitude" fonctions est qu'elles peuvent être appelées de manière implicite et ils ont un drôle de nom.Certains opérateurs ont un sens, qui peut être modifié par le programmeur. On se réfère à la signification d'un opérateur en disant simplement opérateur (voir 5/3). Toutefois, si un tel opérateur est appliqué sur des opérandes pour qui construit-dans le sens est défini, en changer le sens n'est autorisé que pour quelques cas (ce sont d'affectation, l'adresse et l'opérateur virgule, voir 13.5/6).
Un opérateur est un symbole qui est utilisé dans les expressions.
Des exemples sont les suivants: + - * /etc
Sur construit-dans les types d'opérations sont bien définis et unchangable.
Pour les types définis par l'utilisateur les opérateurs peut être définie comme un sucre syntaxique pour une fonction/appel de la méthode
Nous utilisons le terme de fonction/méthode, de façon interchangeable, la plupart du temps. La seule différence est que la méthode est associée à une instance d'un objet de classe. Sinon, ils sont les mêmes. Ils fournissent un moyen de regrouper un ensemble d'instructions.
L'action d'un opérateur sur un type est défini par le compilateur.
L'action d'un opérateur sur un type défini par l'utilisateur est un appel de fonction.
Sa fonction (ou une méthode). L'utilisation d'un opérateur sur un type défini par l'utilisateur est sucre syntaxique pour un appel de fonction. Ils sont toujours à comité de lecture pour que des opérateurs, bien que dans une conversation normale.
Pour les types intégrés oui. Le compilateur a une grande capacité à optimiser les il de l'utilisation.
Pour les types définis par l'utilisateur. Il peut procéder à des optimisations sur les opérateurs comme pour les autres fonctions qui peuvent conduire à y être éliminé, mais le code n'est pas exécuté au moment de la compilation.
Pas. sizeof() est relativement unique.
Edit:
De montrer que l'opérateur dans la classe définie par l'utilisateur se comportent comme des fonctions voici un exemple d'utilisation de mem_fun_ref
Il n'y a pas de différence significative entre les opérateurs et les fonctions, sauf que les opérateurs ont une syntaxe différente. Primitifs les opérateurs ne sont cependant pas des fonctions.
Un opérateur est généralement une opération effectuée sur une variable donnée, une certaine forme de ponctuation. Par exemple, le comportement par défaut de
operator+
entre deux nombres entiers est de les ajouter.Un la fonction est une sous-routine-une réutilisables bloc de code.
Rien, pour autant que le code de l'utilisateur est concerné, sauf pour la syntaxe. Notez que si vous remplacez
operator||
,operator&&
, ou (dans une moindre mesure)operator,
, vous modifiez la sémantique de la construite en exploitant la sémantique. Dans le cas de&&
et||
, vous assurez le fonctionnement de ce qui est normalement un court-circuit dans une opération qui n'est pas. Dans le cas de la virgule, vous devez vous assurer que vous évaluez les arguments de la gauche vers la droite, comme l'opérateur virgule normalement se comporte de cette façon.Ni. Il est défini par l'utilisateur de l'opérateur de surcharge. Un nom de fonction ne peut pas démarrer avec le mot-clé
operator
, et un opérateur est tout simplement le réel signe de ponctuation utilisé pour invoquer la surcharge de l'opérateur, c'est à dire+
ou-
. EDIT: Noter que, bien que, techniquement parlant, il n'est pas une fonction, il a de la sémantique de l'appel de la fonction, comme l'a démontré @Martin York est une excellente réponse.Non,
sizeof
ne peut pas être surchargé. Si vous voulez une certaine forme de compilation opération effectuée, vous devez utiliser quelque chose comme modèle de métaprogrammation. Notez que si le compilateur est capable de faire le calcul au moment de la compilation, il peut éluder l'appel dans votre opérateur surchargé, bien sûr.Is user-defined operator+() a function or operator?
. La surcharge de l'opérateur pour une classe d'utilisateur est une fonction/méthode. L'utilisation de l'opérateur est juste sucre syntaxique pour une fonction/appel de la méthode. a+b est en réalité: un.operator+(b). La méthodeoperator+
se comporte exactement le même que toute autre méthode dans une classe et vous pouvez même prendre son adresse, tout comme toute autre méthode (comme add()).std::mem_fun_ref
, par exemple.En C++, vous pouvez remplacer ce que les symboles +, -, ==, etc. faire lorsqu'il est appliqué à des instances de classe. En définissant le "opérateur+" de la méthode dans la classe A, on dit que le compilateur que faire avec un code comme:
C'est aussi une fonction ou plus précisément une méthode d'instance, dans le sens que c'est quelque chose qui est appelée.
EDIT: voir aussi http://en.wikipedia.org/wiki/Operator_overloading
et http://en.wikibooks.org/wiki/C++_Programming/Opérateurs/Operator_Overloading
Il n'y a pas de différence énorme entre les fonctions et les opérateurs. Vous pouvez penser à l'aide de l'opérateur, par exemple, 'a+b', comme un raccourci pour la fonction operator+(a,b) qui est définie pour les types de a et b. Bien sûr, les opérateurs sur les types primitifs (comme les entiers) et quelques autres exceptions ne sont pas nécessairement définies comme ceci.
Ainsi, pour répondre à quelques unes de vos questions:
Est défini par l'utilisateur de l'opérateur+() une fonction ou un opérateur?
Une fonction qui implémente un opérateur.
opérateur Peut fonctionner sur des opérandes au moment de la compilation? Ils ne fonctionnent toujours au moment de la compilation?
Puisque c'est une fonction, il fonctionne au moment de l'exécution, mais dans certains cas, les optimisations du compilateur peut faire du travail au moment de la compilation pour certains opérateurs. Je ne suis pas sûr à 100% pourquoi vous me demandez cela, alors peut-être il ya quelque chose que je ne suis pas au courant d'ici.
Il y a seulement deux différences mineures entre les fonctions et les opérateurs.
x+y
ouoperator+(a,b)
).operator==
doit avoir exactement deux params). L'exception à cette règle est l'appel de la fonctionoperator()
qui peut être surchargé avec n'importe quel nombre de paramètres.Voici quelques différences entre un opérateur et une fonction:
Un opérateur de ne pas le pousser dans ses paramètres dans la pile, mais une fonction de la pousse de ses paramètres sur la pile.
Le compilateur sait sur le fonctionnement des opérateurs, mais n'est pas au courant de la sortie de la fonction. Dit d'une autre façon, l'action de l'opérateur est défini au moment de la compilation et de la définition d'une fonction est définie au moment de l'exécution.