32 votes

Type de "this" en c ++?

 struct Foo
{
 void f()
 {
 // (*)
 }
};
 

Quel est le type de "ceci" dans la ligne marquée d'un (*)?

Est-ce que c'est const Foo * ou Foo * ?

70voto

ForEveR Points 28133

n3376 9.3.2/1

Dans le corps d'un non-statique (9.3) de la fonction membre, le mot clé c'est un prvalue expression dont la valeur c'est l'adresse de l'objet pour lequel la fonction est appelée.

Le type de cette dans une fonction de membre de une classe de X est X*. Si la fonction de membre est déclarée const, le type de ce qui est const X*, si le membre la fonction est déclarée volatile, le type de ce qui est volatile X*, et si la fonction de membre est déclaré const volatile, le type de ce qui est const volatile X*.

5voto

Kaz Points 18072

À l'intérieur d' f, this type Foo * car f n'est pas un const de la fonction membre.

Vous ne pouvez pas appeler f sur const Foo objet. Le suivant est erroné:

 const Foo obj;
 obj.f();

C'est précisément parce qu'à l'intérieur Foo::f, l' this pointeur est - Foo * plutôt que d' const Foo *, et donc l'appel de la fonction exige un pointeur de conversion qui se défausse d'une qualification.

L' this pointeur lui-même n'est pas une variable. Il n'est pas cessible, mais pas à cause d'un const de qualification. Il n'y a pas de déclaration dans le champ d'application tels que l' Foo *const this. Un this expression n'est tout simplement pas une lvalue, comme une règle de la langue.

L' this pointeur n'est pas très différent de &obj.

3voto

Deleisha Points 11

Le type de cela dépend de la fonction membre.

Par exemple, pour une classe X, si les fonctions membres sont

1) const, alors ceci est du type const X *

2) volatile, alors c'est X * etc volatile

sinon c'est X *

-5voto

vinod Points 116

this fait référence à l'objet actuel. Le type de this dans c ++ est Foo *const .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X