2010-06-21 6 views

Répondre

22

L'opérateur d'affectation doit être une fonction membre non statique et doit avoir exactement un paramètre:

An assignment operator shall be implemented by a non-static member function with exactly one parameter (C++03 13.5.3/1).

operator(), operator[] et operator-> doivent également être mises en œuvre en tant que fonctions membres non statiques.

spécifique de classe operator new et operator delete (et ses variantes) doivent être mises en œuvre en tant que fonctions membres statiques (notez que ce sont implicitement statiques, même si elles ne sont pas déclarés avec le mot-clé static).

+2

Autres raisons de le faire? Il est logique que l'opérateur = soit une fonction membre, après tout, c'est l'une des trois fonctions de contrôle de copie (à savoir le constructeur de copie, l'opérateur = et le destructeur). Mais pourquoi pour les autres? – zoujyjs

+1

Les opérateurs @zoujyjs doivent avoir accès aux variables membres internes (éventuellement privées). Les fonctions gratuites n'auront pas cet accès. – iheanyi

+0

@iheanyi Mais nous pouvons définir la fonction libre comme un ami de la classe –

-1

Il ne peut pas.

La raison, je suppose, a à voir avec le constructeur de la copie. Ils ont une sémantique très similaire, et vous ne pouvez pas définir un constructeur de copie en dehors d'une classe, tout comme les autres constructeurs. Donc, ils ne voulaient pas séparer les jumeaux éloignés (pour éviter le paradoxe des jumeaux :).

P.S. Ce qui est dommage dans C++, c'est que vous ne pouvez pas ajouter un membre à la classe existante. Il n'y a pas de raison de bas niveau pour ça. Si cela est possible, vous pouvez découpler les dépendances d'en-tête et de cpp en ne déclarant pas de fonctions privées dans l'en-tête de définition de classe.

+5

Si vous parlez d'ajouter des membres une fois la définition de classe terminée, il y a certainement des raisons à cela. Vous ne pouvez pas ajouter de membres virtuels plus tard, car au moment où la définition de classe est terminée, le compilateur DOIT connaître la taille de l'objet (y compris vtable!). L'ajout de membres non virtuels en dehors de la définition de la classe rendrait «privé» inutile, car n'importe qui serait en mesure d'ajouter des membres qui ont examiné/modifié des données privées. Dans le contexte de C++ dans son ensemble, il casserait une grande partie de ce qu'ils essayaient d'accomplir. –

+0

Eh bien, d'abord pourrait être bon pour ajouter des membres du public. Deuxièmement, plus important encore, cela ne nécessiterait qu'un «ami» ou une sorte de déclaration anticipée dans la définition de la classe, ce qui aiderait à découpler les dépendances. –

+0

Je ne suis pas votre point à propos de la 'honte' en C++. Si vous voulez vraiment ajouter quelque chose à une classe existante, pourquoi ne pas simplement créer une sous-classe? Au lieu de cela, si ce que vous vouliez faire est de "modifier" la classe d'origine après qu'elle ait été entièrement implémentée, je ne pense pas que c'est ainsi que fonctionne C++. – Diaz

Questions connexes