web-dev-qa-db-fra.com

Est-il possible d'obtenir l'adresse du pointeur «this»?

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
16
Range Hao

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++.

8
UniversE

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!

4
Abhishek Sinha

Le mot clé this se comporte essentiellement comme &__self__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 .

2
curiousguy