web-dev-qa-db-ja.com

「this」ポインタのアドレスを取得することは可能ですか?

thisは右辺値であり、&thisを適用してそのアドレスを取得することはできません。

私のコードでは、thisへの参照バインディングを使用しようとしました。どちらの方法でthisのアドレスを取得できるのでしょうか。または両方間違っていますか?

thisとは正確には何ですか?左辺値、右辺値、キーワード、または他の何か?

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

どちらがthisのアドレスを与えるのだろうか?または両方が間違っていますか?

C++抽象マシンはアドレスを定義していないので、thisのアドレスも同じではありません。 this0に似ています。アドレス0を取得することはできません。これは、ストレージを持つエンティティではなく、単なる値です。これは何をするのでしょうか?

int const& i = 0;

一時オブジェクトを作成し、0で初期化してから、参照をそれにバインドします。コードでもまったく同じことが起こります。 thisの-​​valueを保持するさまざまな一時オブジェクトへの参照を作成します。

thisは、メンバー関数が実行されているオブジェクトのアドレスを表すキーワードです。 C++抽象マシンは、ストレージを占有する必要がないため、常に(論理的に)0のような単純な値です。

ストレージを占有するためにthisを必要としないことにはメリットがあります。 thisがレジスター(通常はアドレス指定できないもの)で渡されるABIを介してC++を実装できます。 &thisを明確に定義する必要がある場合、つまりthisをアドレス可能にする必要がある場合、アドレスを渡すためにレジスターを使用する実装が妨げられます。 C++標準は一般に、そのような実装を結び付けないことを目的としています。

thisのアドレスを取得できない」という意味は、&thisを記述できないことです。

thisポインタでアドレスrepresentedを要求していますよね?これは、最初の出力が行うことです。

this自体は、たとえばポインタのように具体化されません。 MyString* xになります。ここでは、x自体にメモリ内の場所があり、sthを実行できます。 &xなど。これはthisでは不可能です。

あなたの最後の質問への答えは:はい、thisはキーワードです。式thisは一次式です。これについては、C++標準のセクション[expr.prim.this]で読むことができます。

8
UniversE

thisは、current objectへのアドレスを含むポインターです。どこかに格納されている(または変更できる)変数ではなく、特別なプロパティを持つ特別なキーワードです。

「現在のオブジェクト」のアドレスを知りたい場合は、プログラムで次のように出力するだけです。

#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;
 }

上記のプログラムは以下の出力を生成します:

Objのアドレス:: 0x7fffef913627

これのアドレス:: 0x7fffef913627

PTRの追加:: 0x7fffef913627

お役に立てば幸いです。

4
Abhishek Sinha

thisキーワードは基本的に&__selfとして動作します。ここで、__selfは、メンバー関数が実行されるオブジェクト(*thisオブジェクト)を指定する左辺値です。ただし、オーバーロードされたoperator&()は使用されません。

したがって、&this&&__selfを意味します。これは明らかに意味がありません。関数のスカラー戻り値のアドレスを取得できないのと同じように、アドレスのアドレスを取得できません。

int fi(); 
int *fpi(); 

&(fi())&(fpi())はどちらも不正です。返される右辺値はスカラー(おそらくレジスタに格納される)であり、純粋なスカラー値にはアドレスがないためです

2
curiousguy