Récemment tandis que j'expliquais la différence de base entre les pointeurs et les références (dans le contexte de la programmation C ++) à une personne, j'ai raconté les explications habituelles qui parlent de différentes conventions de transaction de fonction - appelez par valeur, appelez par référence, appelez par référence et toute la théorie associée sur les références.
Mais alors je pensais que toute référence c + fait en termes d'argument qui passe (permet une façon efficace de mémoire de transmettre de grandes structures / objets, le maintient en même temps en permettant la sécurité Callee modifier toutes les variables de l'objet passés comme référence, si notre conception le demande) p>
Un pointeur de const en C réaliserait la même chose, par exemple Si l'on doit passer un pointeur de structure dit Sily MySTR * PTR, en casnant le pointeur de structure comme constante - P>
func(int,int,(const struct mystr*)(ptr));
3 Réponses :
Vous pouvez lier une référence constante à une rvalue: mais il est impossible de passer l'adresse d'une rvalue: p> Les références ont été introduites dans la langue pour soutenir la surcharge de l'opérateur. Vous voulez pouvoir dire Références prend en charge principalement Pass par référence em>, les pointeurs prennent principalement en charge la sémantique em>. Oui, je sais, la distinction n'est pas toujours assez claire en C ++. P> p> a - b code>, pas
& a - & b code>. (Notez que ce dernier a déjà une signification: la soustraction du pointeur.) P>
Obtenez votre point, mais surtout, on passerait une référence à un objet / variable., Qui serait essentiellement une variable plutôt qu'un const, donc dans ce cas ...
@ Gold: Ah, vous parlez de références non-const. Oui, dans ce cas, la seule différence pratique que je vois (en plus de la commodité notionnelle) est le fait qu'il n'y ait rien de tel que le null code> référence. Donc, si
null code> est une option valide, utilisez un pointeur, utilisez sinon une référence.
Il existe deux scénarios de cas d'utilisation typiques: p>
Premier: les pointeurs désignent des arguments facultatifs. Étant donné que les références ne peuvent pas être Deuxièmement: les références ne sont utilisées que conjointement avec le mot-clé Const, car la syntaxe appelante suggère à la sémantique du lecteur passe-valeur, qui est par définition constante. Ensuite, les pointeurs ne sont utilisés que pour des arguments pouvant être changés par la callee. P>
Je préfère personnellement la première option, car chacun des quatre cas "Référence Const", "Référence non-Const", "Constoire", "Pointeur non-Const" a une signification différente. L'option deux seulement différencie entre deux "choses": "La fonction peut modifier que la fonction" vs "" ne modifiera pas cette valeur ". P> null code>, mais les pointeurs peuvent, document dans le style de codage que tout argument noté en tant que pointeur, peut être
null code>, la fonction doit être gérée. Les arguments facultatifs peuvent alors être constitués de const ou de non-const, tels que des arguments obligatoires (référence). P>
Je ne suis pas d'accord sur les «fonctions qui prennent des pointeurs doivent toujours vérifier NULL» - si quelqu'un vous transmet un pointeur nul, il est généralement le résultat d'une erreur de programmation sérieuse et un crash est la chose la plus raisonnable à se produire. Si vous avez des paramètres vraiment facultatifs, c'est un signe que vous devez simplement avoir une fonction différente, surchargée, ou vous devez extraire un objet de méthode.
@Billy Oneal: Dans ce modèle (qui n'a pas été inventé à la volée par moi), l'écrivain de la fonction doit s'assurer qu'il ne désigne que ces arguments comme des pointeurs où donner null code> n'est pas grave Erreur de programmation. Exemple idiot: vous voulez une journalisation, donnez un enregistreur non nulle à la fonction. Exemple SigProcmask . Où il s'agit d'une erreur de donner
null code>, la fonction doit prendre une référence en premier lieu. Oui, cela signifie que la plupart des fonctions ne prennent que des références (ou par la valeur, si cela est opportun).
En termes d'objet de référent, quel code peut manipuler étant donné une référence de const est identique à ce qu'il peut faire avec un pointeur à un objet Const et de la même manière ce qu'il peut manipuler étant donné qu'une référence non constituée est la même que Compte tenu d'un pointeur sur un objet non-Const.
Quelle référence empêche la fonction appelée de faire évolue quel objet la référence fait référence à la référence ou à l'arithmétique du pointeur sur la référence. P>
En termes d'appelant, une référence Const peut être liée directement à une rvalue et vous avez une sémantique bien définie lors de la création et de la détruire des objets passés comme des arguments. Il s'agit d'un idiome courant - de construire une temporaire pour un argument: p> mais il n'est pas immédiatement évident que l'objet FOO dans ceux-ci a une durée de vie supérieure à la longueur de L'appel de la fonction: p> // declaration
void bar ( const Foo* );
// use
Foo temp;
bar ( &temp );
// cast to avoid warning about taking address of temporary
bar ( &static_cast<const Foo&>( Foo() ) );
// helper function to same effect
template<typename T> const T* address_of ( const T& t) { return &t; }
bar ( address_of ( Foo() ) );
Je pense que vous avez confondu "Conster pointeur" avec "pointeur à const".
Super! Mais la question peut réellement avoir signifiait ce qu'elle a dit: "Consteur pointeur" (comme une référence, il ne peut pas être rebondir) plutôt que "pointeur à const".
@Ben: Qu'est-ce que je voulais dire dans la op est "const
@Ellusive: Comment les pointeurs sont-ils moins «de type-sécurité» que des références?