2009-10-22 8 views
6

la question est simple ... Y at-il une différence dans l'utilisation de ce-> yourvariable ou yourvariable directement pour une raison quelconque?le "this" pointeur à l'intérieur d'une classe

Je ne trouve aucun problème avec cela, mais je l'utilise beaucoup- et je voudrais savoir s'il y a une différence avant d'aller plus loin.

J'ai vu un commentaire sur un post ici et je ne me souviens pas quel fil, mais la personne a dit quelque chose à propos de l'utilisation du mot-clé "this".

Personnellement, je trouve agréable d'utiliser directement la variable. Cela rend le code plus facile et plus joli.

Joe

+2

voir: http://stackoverflow.com/questions/993352/when-should-i-make-explicit-use-of-the-this-pointer –

+0

La plupart des directives de codage que j'ai lu froncer les sourcils en faisant cela sans raison valable . C'est le bruit de code qui n'ajoute aucune signification. Toute personne lisant votre code devrait pouvoir déduire du contexte que vous utilisez un membre de la classe. – dss539

+0

L'utilisation de 'this' rend explicitement le programme plus lisible – Xinus

Répondre

12

Non, il n'y a pas de différence réelle, il est tout simplement un qualificatif de portée. Cependant, supposons une méthode

void SetFoo(Foo foo) 
{ 
    this->foo = foo; 
} 

où this-> foo est un membre privé. Ici, il vous permet de prendre un paramètre avec le même nom qu'une variable de classe/instance.

0

Cela a été un peu demandé et a répondu à propos de C# here et je pense que la réponse (au moins la mienne) est la même. C'est la préférence.

1

Je trouve que l'utilisation de this rend mon code plus lisible, mais il n'y a aucune raison de le faire. Si vous regardez le code assembleur que votre compilateur génère, il devrait être fonctionnellement (et littéralement littéralement) identique.

Fondamentalement, lorsque la fonction est appelée, il est passé un argument caché this qui est ensuite utilisé pour déterminer quelles variables sont où. Si vous utilisez les variables directement, sans this->, vous ne faites rien d'autre que d'utiliser du sucre syntaxique.

16

Dans la plupart des cas, il n'y a pas de différence. Mais il y a des situations où il fait une différence:

class foo 
{ 
    int i; 
    void bar() { 
     int i = 3; 
     i; // refers to local i 
     this->i; // refers to the member i 
    } 
}; 

En outre, avec des modèles dont vous avez besoin pour qualifier un membre de this-> de telle sorte que la recherche de nom est retardé:

template<typename T> 
struct A 
{ 
    int i; 
    T* p; 
}; 

template<typename T> 
struct B : A<T> 
{ 
    void foo() { 
     int k = this->i; // here this-> is required 
    } 
}; 

Un compilateur qui fait bien la "recherche en deux phases" se plaindra au cas où vous supprimez "this->" qu'il ne sait pas ce que je suis supposé être. "this->" indique que c'est un membre d'une classe de base. Étant donné que la classe de base dépend d'un paramètre de modèle, la recherche est retardée jusqu'à ce que le modèle de classe soit instancié.

+0

+1 pour signaler le problème de modèle. gcc dit généralement que quelque chose le long de la ligne ' ne dépend pas d'un paramètre de modèle donc une définition doit être disponible'. –

Questions connexes