1

私の理解では、ポインタ変数を定義するとき、その変数のために RAM にスペースを割り当てています。

int *p;  

RAMにスペースを定義します。次に、`&variable' を使用してそのポインタにメモリ アドレスを割り当てます。

私は次の例を見ています: *this vs this in C++ コードは:

#include <iostream>

class Foo
{
    public:
        Foo()
        {
            this->value = 0;
        }

        Foo get_copy()
        {
            return *this;
        }

        Foo& get_copy_as_reference()
        {
            return *this;
        }

        Foo* get_pointer()
        {
            return this;
        }

        void increment()
        {
            this->value++;
        }

        void print_value()
        {
            std::cout << this->value << std::endl;
        }

    private:
        int value;
};

int main()
{
    Foo foo;
    foo.increment();
    foo.print_value();

    foo.get_copy().increment();
    foo.print_value();

    foo.get_copy_as_reference().increment();
    foo.print_value();

    foo.get_pointer()->increment();
    foo.print_value();

    return 0;
}

*オペレーターを前Foo* get_copy()に置く目的と何をするのかわかりませんFoo* get_pointer()。notを返す*ときに関数からを削除すると、エラーが発生するのはなぜですか?Foo*this*this

編集:

また、理由は次のとおりです。

foo.get_copy().increment();
foo.print_value();

2 ではなく 1 を生成しますか?

4

5 に答える 5

2

*オペレーターを前Foo* get_copy()に置く目的とその目的がわかりませFoo* get_pointer()

Foo* get_pointer()

Foo*オブジェクトを指すポインターです。Foo

thisメンバー関数の呼び出し元オブジェクトに暗黙的にバインドするポインターでもあります。そのため、これらの関数の戻り値の型は ではありFoo*ませんFoo

于 2013-04-16T22:36:46.393 に答える
1

this、どこにも明示的に言及していませんが、常にC ++のポインターです。したがって、 this ポインターを返すときに、使用する必要がありますFoo*

this実際には、関数呼び出し中に渡される暗黙的なオブジェクトであり、関数を呼び出すオブジェクトへのポインターです

于 2013-04-16T22:37:36.460 に答える
1

*はタイプの一部です。ということはtypeをint意味intし、 int*type へのポインタintです。関数が int へのポインタを返す場合はint* foo()であり、への ポインタを返す場合Fooは ですFoo* Foo::get_pointer()

定義は、定義されたオブジェクト用にスペースを予約します。宣言はスペースを予約しません。また、オブジェクトではないもの (参照や関数など) の定義もスペースを予約しません。(明らかに、関数はメモリ内のどこかに存在し、多くの場合、コンパイラは参照の実装にもスペースを必要とします。しかし、それらは C++ のスコープ内では見えません。)

于 2013-04-16T22:42:31.640 に答える
-1

"this" is a pointer.
インスタンス (特定の割り当てられたオブジェクト) へのポインターを返したい場合。

 Foo* get_pointer(){
            return this;
        }

または、コピーへのポインターを返したい場合は、新しいオブジェクトを割り当てます。

//need to implement the copy here
       Foo* get_copy(){
            return this;
        }

参照 (インスタンスのアドレス) ではありません。これが、ポインタを返す必要がある理由です。

于 2013-04-16T22:42:12.983 に答える