2010-05-01 31 views
20

Tôi hiểu những gì this, nhưng sự khác biệt giữa *thisthis 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ó ...

Trả lời

44

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.

+1

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? –

+0

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

+5

Đá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

8

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_ptrint& i_ref khác nhau.

-4

Không có sự khác biệt thực sự, this->foo() giống với (*this).foo().

+0

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 :) –