J'ai lu que this
est une valeur r et nous ne pouvons pas obtenir son adresse en appliquant &this
.
Dans mon code, j'ai essayé d'utiliser une liaison de référence à this
. Je me demande de quelle façon donnera l'adresse de this
? Ou ont-ils tous les deux tort?
Qu'est-ce que this
exactement? Une lvalue, une rvalue, un mot-clé ou autre chose?
void MyString::test_this() const{
std::cout << "this: " << this << std::endl;
const MyString * const& this_ref = this;
std::cout << "thie_ref: " << &this_ref << std::endl;
const MyString * const&& this_right = this;
std::cout << "thie_right: " << &this_right << std::endl;
}
//this: 00CFFC14
//thie_ref: 00CFFB14
//thie_right: 00CFFAFC
Je me demande qui peut donner l'adresse de
this
? Ou les deux ont tort?
L'adresse de this
n'est pas non plus, car la machine abstraite C++ ne lui définit pas d'adresse. this
est comme 0
. Vous ne pouvez pas obtenir l'adresse de 0, ce n'est pas une entité avec du stockage, juste une certaine valeur. Alors qu'est-ce que cela fait?
int const& i = 0;
Il crée un objet temporaire, l'initialise avec 0, puis lui lie la référence. La même chose exacte se produit dans votre code. Vous créez des références à différents objets temporaires qui contiennent la valeur de this
.
this
est un mot-clé qui représente l'adresse de l'objet pour lequel la fonction membre est exécutée. La machine abstraite C++ ne l'exige pas pour occuper le stockage, c'est donc (logiquement) juste une valeur simple, comme 0.
Il n'est pas nécessaire d'exiger que this
occupe le stockage. Il permet à C++ d'être implémenté sur un ABI où this
est passé dans un registre (quelque chose qui n'est pas adressable normalement). Si &this
devait être bien défini, c'est-à-dire que si this
devait être adressable, cela empêcherait une implémentation d'utiliser un registre pour transmettre l'adresse. Le standard C++ vise généralement à ne pas lier les implémentations comme ça.
Ce que signifie "vous ne pouvez pas prendre l'adresse de this
", c'est que vous ne pouvez pas écrire &this
.
Vous demandez l'adresse représentée par le pointeur this
, non? C'est ce que fait votre première sortie.
this
lui-même n'est pas matérialisé comme un pointeur, comme par ex. MyString* x
serait. Ici, x
lui-même a un emplacement en mémoire et vous pouvez faire qc. comme &x
. Ce n'est pas possible pour this
.
La réponse à votre dernière question est: oui, this
est un mot-clé. L'expression this
est une expression principale. Vous pouvez en lire plus dans la section [expr.prim.this]
du standard C++.
this
est un pointeur contenant l'adresse du current object
. Ce n'est pas une variable qui est stockée quelque part (ou pourrait même être modifiée), c'est un mot-clé spécial avec des propriétés spéciales.
Si vous voulez connaître l'adresse de "l'objet courant", vous pouvez simplement sortir comme indiqué ci-dessous dans le programme:
#include<iostream>
using namespace std;
class Test
{
public:
void fun()
{
cout << "Address of this :: " << this << endl;
void *ptr = this;
cout << "Addrss of ptr :: " << ptr << endl;
}
};
int main()
{
Test obj;
cout << "Address of obj :: " << &obj << endl;
obj.fun();
return 0;
}
Le programme ci-dessus produit la sortie ci-dessous:
Adresse d'obj :: 0x7fffef913627
Adresse de ceci :: 0x7fffef913627
Addrss de ptr :: 0x7fffef913627
J'espère que ça aide!
Le mot clé this
se comporte essentiellement comme &__self
Où __self
Est une valeur l désignant l'objet sur lequel la fonction membre est exécutée (l'objet *this
) Sauf qu'un surchargé operator&()
n'est pas utilisé.
Donc &this
Signifierait &&__self
Ce qui n'a évidemment aucun sens, vous ne pouvez pas prendre l'adresse d'une adresse, tout comme vous ne pouvez pas prendre l'adresse d'une valeur de retour scalaire d'un fonction:
int fi();
int *fpi();
&(fi())
et &(fpi())
sont illégales car la valeur renvoyée est un scalaire (probablement stocké dans un registre) et car une valeur scalaire pure n'a pas d'adresse .