2009-05-10 5 views
1

Je regarde le fichier .h d'une classe Wrapper. Et la classe contient un membre privé:Question sur & operator en C++

T* dataPtr; 

(où T comme à l'template < class T > défini en haut du fichier .h)

La classe fournit deux « * surcharge opérateur » méthodes:

T& operator*() 
{ 
    return *dataPtr; 
} 

const T& operator*() const 
{ 
    return *dataPtr; 
} 

Les deux retournent simplement *dataPtr, mais qu'est-ce que la notation "*dataPtr" renvoie réellement, en anglais courant? Et comment cela correspond-il au type de retour "T&"?

Répondre

6

Le type de retour T & indique que vous renvoyez une référence d'une instance d'un objet T. dataPtr est un pointeur, que vous "déréférencer" (obtenir la valeur de référence/instance d'un pointeur) en utilisant *.

2

dataPtr est un pointeur vers quelque chose. L'opérateur * déréférence le pointeur, donc * dataPtr est (ou, au lieu de 'est', vous pouvez dire 'se réfère à' ou 'fait référence à') la pointee, c'est-à-dire la chose vers laquelle pointe dataPtr . Cela signifie 'une référence à un objet dont le type est T' (à ne pas confondre avec T * qui signifie 'un pointeur sur un objet de type T').

1

*DataPtr sont les données réelles pointées par DataPtr. Les deux opérateurs renvoient une référence à T. Un référence est un type que vous devriez considérer comme un autre nom pour la valeur à laquelle il fait référence. "Sous le capot", c'est comme un pointeur, mais ne pense pas de cette façon. Il ne peut pas faire de maths de pointeur, ou être "repositionné". Un des opérateurs est const et est utilisé sur un objet const, et l'autre est utilisé sur un objet normal.

1

La classe wrapper semble agir comme un pointeur C++.

L'opérateur * déréférence l'encapsuleur qui évaluera la chose qu'il stocke (dans dataPtr). Ce que vous obtenez est une référence à ce contenu. Par exemple. vous pouvez assigner quelque chose à la référence

*intWrapper = 42;

Il y a deux opérateurs, car il est une constante et une version non constante. Lorsque vous déréférencer une classe wrapper constante, vous ne pouvez pas lui affecter (une référence const (T &) est renvoyée)