Tôi hiểu những gì this
, nhưng sự khác biệt giữa *this
và this
là gì?* this vs this in C++
Vâng, tôi đã google và đọc qua *this
trong cuốn sách văn bản của tôi, nhưng tôi chỉ không nhận được nó ...
Tôi hiểu những gì this
, nhưng sự khác biệt giữa *this
và this
là gì?* this vs this in C++
Vâng, tôi đã google và đọc qua *this
trong cuốn sách văn bản của tôi, nhưng tôi chỉ không nhận được nó ...
this
là một con trỏ, và *this
là một con trỏ dereferenced.
Nếu bạn đã có một chức năng đó quay trở lại this
, nó sẽ là một con trỏ đến đối tượng hiện tại, trong khi một chức năng mà trở *this
sẽ là một "bản sao" của đối tượng hiện tại, cấp phát trên stack - trừ bạn đã chỉ định kiểu trả về của phương thức để trả về một tham chiếu.
Một chương trình đơn giản cho thấy sự khác biệt giữa điều hành trên bản và tài liệu tham khảo:
#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;
}
Output:
1
1
2
3
Bạn có thể thấy rằng khi chúng tôi hoạt động trên một sao chép của đối tượng địa phương của chúng tôi , các thay đổi không tồn tại (vì đó là một đối tượng khác hoàn toàn), nhưng hoạt động trên tham chiếu hoặc con trỏ không tiếp tục thay đổi.
this
là con trỏ đến phiên bản của lớp. *this
là tham chiếu giống nhau. Chúng khác nhau theo cùng cách mà int* i_ptr
và int& i_ref
khác nhau.
Không có sự khác biệt thực sự, this->foo()
giống với (*this).foo()
.
ahh có, đoán tôi nên đã ném rằng trong trình biên dịch đầu tiên để xác minh :) –
Tôi đang xác thực ở đây: trả lại * điều này không trả về tham chiếu của đối tượng mà là bản sao của đối tượng? –
Bạn có quyền yêu cầu. * điều này trong thực tế trả về một tham chiếu đến đối tượng. Ví dụ nếu bạn quá tải toán tử [] trong lớp của bạn, bạn có thể sử dụng lớp (* this) [] thay vì toán tử []. – ypnos
Đánh dấu, ví dụ của bạn là gây hiểu lầm. Hãy thử Foo & get_copy() {return * this; }. Sau đó, bạn thấy rằng trên thực tế * đây là một REFERENCE. – ypnos