2012-11-27 2 views
5

La classe avec ce code est une classe de référence pour un pointeur de ClassName, à savoir:Ran dans cela au travail "opérateur NomClasse *". Qu'est-ce que ça veut dire?

class ClassName; 

class ClassRef 
{ 
    ClassName* m_class; 
    ... 
    operator ClassName *() const { return m_class; } 
... 

Je suppose ceci est utilisé pour les contrôles de validité du pointeur, comme:

ClassRef ref(new ClassName()) 
if (ref) { bla bla bla } 

Ai-je raison dans ma pensée?

+3

Est-ce 'classname' ou' ClassName'? Veuillez être * précis * dans le code présenté. –

Répondre

9

Il s'agit d'une surcharge de l'opérateur de conversion. Chaque fois qu'un objet ClassRef doit être converti en un type de pointeur ClassName, cet opérateur est appelé.

Ainsi;

ClassRef r; 
ClassName * p = r; 

utilisera cette surcharge.

+0

Donc, je viens d'écrire un petit test impliquant deux classes - Base et Ref. Lorsque j'ai essayé d'utiliser la référence dans une instruction "if", cette surcharge de l'opérateur a été appelée - pourquoi? – NindzAI

+1

@NindzAI: le "si" nécessite tout ce qui peut être évalué 0 ou non-0. Classname ne peut pas, mais ClassRef * (étant un pointeur) peut. Et puisque 'ref' peut être converti en un pointeur via cet opérateur de conversion, cela s'appelle. –

+0

@NindzAl C'est parce que, pendant que le compilateur tente d'obtenir une valeur qui peut être utilisée à la place d'une expression 'bool', il trouve que' ClassRef' peut être converti en un type de pointeur. Vous remarquerez que si vous fournissez directement un opérateur de conversion à un 'bool', celui-ci sera préféré. Et si vous fournissez une conversion à un autre type de pointeur, vous obtiendrez une erreur de compilateur en raison de l'ambiguïté. – enobayram

Questions connexes