Dans l'extrait de code, je suis capable d'accéder à la variable de membre privé en dehors de la portée de la classe. Bien que cela ne soit jamais fait, pourquoi est-il autorisé dans ce cas? Est-ce une mauvaise pratique de recevoir une variable privée retournée par référence? et concernant cette méthode, qu'est-ce que le type de retour transmet? Et aussi, quand devrais-je avoir un type de retour de ce type? P> PS: strong> Je suis désolé si la ligne d'objet est vague. Quelqu'un peut-il le changer au contenu pertinent ici. Merci. p> p>
5 Réponses :
Renvoyer des membres privés comme référence est parfaitement valide et le programmeur qui écrit une classe est responsable de choisir avec soin si cela devrait être autorisé. Ce lien donne un exemple lorsque cela peut être fait. P>
Ce code: signifie que la fonction renvoie une référence em> à un entier. Tout comme lors du passage d'une valeur par référence à une fonction, si la valeur de retour de Dans le code que vous avez écrit, cela signifie que vous laissez la variable privée N'oubliez pas Vous devez généralement éviter de renvoyer des références car il le rend fou - difficile à comprendre lorsque des constructeurs / destructeurs sont appelés. Cependant, le retour d'une référence peut être plus rapide. Si votre méthode a renvoyé un type d'orme énorme, renvoyant un type d'orme Conston référence à ce même type de structure ne doit prendre que quatre à huit octets (un pointeur sur cet objet). Cependant, il existe de meilleurs moyens d'optimiser pour ce type de chose. P> P> Methodtwo code> est modifiée, la valeur que méthodtwo code> est retournée. Dans ce cas, champ de classe x code>. P> x code> échapper à sa portée ( un champ de classe) et être transmis dans le monde extérieur. Ceci est certainement une mauvaise pratique (car x code> peut être modifié de manière à casser la classe foo code>, mais il est certainement admissible. P>
Je suis fortement fortement en désaccord sur le point "Vous éviter de renvoyer des références de renvoi" - étant donné que le compilateur est libre d'élire les appels au constructeur de copie si vous revenez de valeur, la seule chose que vous gagnez dans de nombreux cas en retournant par la valeur est lente. Builds de débogage (car le compilateur se trouve RVO / NRVO sur vous en mode version).
Ne pas être un utilisateur de gourou de niveau C ++, je me réserve le droit de se tromper :) Mais vous n'obtiendrez-vous pas un comportement indéfini si vous retournez une référence à une variable locale? (C'est-à-dire que vous êtes laissé avec un pointeur à un point aléatoire sur la pile?)
C'est correct. Tenter d'accéder à une variable détruite via des résultats de référence dans un comportement non défini. Mais pour des choses comme des getters de classe de retour en référence, c'est un comportement normal et attendu.
Est-ce une mauvaise pratique de recevoir une variable privée retournée par référence? P>
blockQuote>
Non, cela dépend de ce que vous voulez. Des choses comme privé code> ne signifie pas "Cette mémoire ne peut être modifiée que par les fonctions de membre" - cela signifie "tentatives directes pour accéder à cette variable entraînera une erreur de compilation". Lorsque vous exposez une référence à l'objet, vous avez effectivement exposé l'objet. P>
std :: vecteur const code>. p>
Pour les personnes qui passent: Cette question suggère qu'il peut être dangereux pour renvoyer une référence à vos membres de la classe.
@Arthur: Oui, comme je l'ai dit, cela dépend de ce que vous voulez faire. Ça marche très bien pour std :: vecteur code> - mais il y a beaucoup de cas où c'est la mauvaise chose à faire aussi.
Comme Donotalo a dit, il est parfaitement valide. L'idée d'avoir des membres privés consiste à interdire d'autres classes / fonctions pour accéder au membre privé de la classe sans em> votre permission. Si vous êtes heureux de faire une fonction pour permettre aux autres classes / fonctions d'accéder à vos membres privés, le compilateur n'a rien contre celui-ci: -) p>
Habituellement, il est utile d'avoir un membre privé et d'avoir une fonction obtenir em> pour permettre aux autres classes / fonctions d'obtenir la valeur de la fonction, mais seule la classe sera en mesure de le changer. p>
Je suis capable d'accéder à la variable de membre privé en dehors de la portée de la classe p> blockQuote>
Si vous vous référez au
x code> dansprincipale () code> alors qui est différent dux code> déclaré dansClasse FOO < / code>. Si vous essayez d'accéder auobj.x code>, le compilateur se plaint certainement. P>Est-ce une mauvaise pratique de recevoir une variable privée retournée par référence? p> blockQuote>
Il n'y a rien de mal dans "recevoir" la référence à un membre privé. Mais donner la référence à un membre privé rend la déclaration inutile privée inutile. En déclarant une variable d'être membre privé, vous limitez l'accès à ce membre uniquement aux méthodes de la classe. P>
Concernant cette méthode, qu'est-ce que le type de retour transmet? Et aussi quand devrais-je avoir un type de retour de ce type? P> blockQuote>
Pas sûr de la méthode que vous parlez de la méthode?!?!?! P>
Vraiment? Cela le rend inutile? Comment expliquez-vous std :: vecteur