Renvoi d'une référence d'une fonction en C ++

Il est possible de retourner une référence d'une fonction. Mais attention si vous essayez de le faire: Vous ne voulez pas renvoyer une référence à une variable locale dans une fonction - parce que quand la fonction se termine, l'espace de stockage pour les variables locales disparaît. Pas bien!

Mais vous pouvez retourner une référence à une variable globale. Ou, si la fonction est une fonction de membre, vous pouvez renvoyer une référence à une variable membre.

Par exemple, voici une classe qui possède une fonction qui renvoie une référence à l'une de ses variables:

classe DigInto {private: int secret publique: DigInto () {secrète = 150-} int GetSecretVariable () {return} secret-vide Write () {cout lt; lt; secret lt; lt; endl-}} -

Remarquez les magasins du constructeur dans le 150 secret variable, qui est privé. La GetSecretVariable () fonction retourne une référence à la variable privée appelée secret. Et le Écrire() fonction écrit sur la valeur de la secret variable. Beaucoup de secrets ici! Et quelques surprises aussi. Vous pouvez utiliser cette classe comme ceci:




int main (int argc, char * argv []) {DigInto inst-inst.Write () - int levier = inst.GetSecretVariable () - levier = 30 inst.Write () - retourner 0-}

Lorsque vous exécutez ce, vous voyez la sortie suivante:

15030

La première ligne est la valeur de la variable de droite secrète après que la demande crée l'instance. Mais regardez attentivement le code: La variable appelée levier est une référence à un nombre entier, et il obtient les résultats de GetSecretVariable (). Et quelle est cette raison?

Il est une référence à la variable privée appelée secret - ce qui signifie que levier elle est maintenant une référence à cette variable. Oui, une variable en dehors de la classe se réfère désormais directement à un membre de l'instance privée! Après cela, vous définissez levier à 30. Lorsque vous appelez Écrire() encore une fois, la variable privée va en effet changer.

Est-ce que sembler une mauvaise idée? Vous faites la variable privée. Et maintenant, le GetSecretVariable () fonction à peu près anéanti tout sens de la variable effectivement reste privé. La main () fonction était en mesure de récupérer une référence à elle et fouiner et de le changer mais il voulait, comme si il n'y avait pas privé! Problème dans la terre de C!

Voilà un problème avec les références: Ils peuvent potentiellement laissez pas votre code grande ouverte. Par conséquent réfléchir à deux fois avant de retourner une référence à une variable. Voici l'un des plus grands risques: Quelqu'un d'autre pourrait être en utilisant ce code, ne peuvent pas comprendre les références, et peuvent ne pas se rendre compte que la variable appelé levier a un lien direct vers le privé secret variable.

Une telle programmeur inexpérimenté pourrait alors écrire du code qui utilise et changements levier - sans se rendre compte que la variable de membre est en train de changer avec elle. Par la suite, puis, une punaise Résultats - un assez méchant à cela!

Parce que des fonctions renvoyant des références peuvent laisser les programmeurs C ++ méfiants et moins expérimentés avec juste un tout petit peu trop de pouvoir sur leurs mains, faire preuve de prudence avec les références. Non, vous n'êtes pas obligé de les éviter altogether- juste faire attention. Utilisez-les seulement si vous vous sentez vraiment que vous devez. Mais rappelez-vous aussi que la meilleure approche dans les classes est d'avoir des fonctions d'accès des membres qui peuvent garder les variables privées.

Toutefois, les références peuvent être très puissants, à condition que vous comprenez ce qu'ils font. Lorsque vous utilisez une référence, vous pouvez facilement modifier une autre variable, sans avoir à passer par des pointeurs - qui peut rendre la vie beaucoup plus facile parfois. Alors, s'il vous plaît: Utilisez soigneusement vos nouveaux pouvoirs.


» » » » Renvoi d'une référence d'une fonction en C ++