2010-05-01 2 views

ответ

44

this является указателем, а *this является разыменованным указателем.

Если у вас есть функция, которая возвращала this, это будет указатель на текущий объект, в то время как функция, которая вернулась *this бы «клон» текущего объекта, выделенного в стеке - , если только вам указали возвращаемый тип метода для возврата ссылки.

Простая программа, которая показывает разницу между работой на копиях и ссылки:

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

Выход:

1 
1 
2 
3 

Вы можете видеть, что, когда мы работаем на копию нашего локального объекта , изменения не сохраняются (потому что это совсем другой объект целиком), но работа по ссылке или указателю делает сохраняются изменения.

+1

Я проверяю здесь: return * это не возвращает ссылку объекта, а копию объекта? – 2010-05-01 14:41:15

+0

Вы имеете право спросить. * это фактически возвращает ссылку на объект. Например, если вы перегрузите оператор [] в своем классе, вы можете использовать внутри класса (* this) [] вместо оператора []. – ypnos

+5

Марк, ваш пример вводит в заблуждение. Попробуйте Foo & get_copy() {return * this; }. Тогда вы видите, что на самом деле * это СПИСОК. – ypnos

8

this является указателем на экземпляр класса. *this является ссылка к тому же. Они отличаются друг от друга так же, как и int* i_ptr и int& i_ref.

-4

Нет реальной разницы, this->foo() - это то же самое, что и (*this).foo().

+0

ahh да, думаю, я должен был бросить это в компиляторе сначала, чтобы проверить :) –

Смежные вопросы