Я понимаю, что this
делает, но в чем разница между *this
и this
?* это против этого в C++
Да, я Googled и читать над *this
в моем тексте книге, но я просто не понимаю ...
Я понимаю, что this
делает, но в чем разница между *this
и this
?* это против этого в C++
Да, я Googled и читать над *this
в моем тексте книге, но я просто не понимаю ...
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
Вы можете видеть, что, когда мы работаем на копию нашего локального объекта , изменения не сохраняются (потому что это совсем другой объект целиком), но работа по ссылке или указателю делает сохраняются изменения.
this
является указателем на экземпляр класса. *this
является ссылка к тому же. Они отличаются друг от друга так же, как и int* i_ptr
и int& i_ref
.
Нет реальной разницы, this->foo()
- это то же самое, что и (*this).foo()
.
ahh да, думаю, я должен был бросить это в компиляторе сначала, чтобы проверить :) –
Я проверяю здесь: return * это не возвращает ссылку объекта, а копию объекта? – 2010-05-01 14:41:15
Вы имеете право спросить. * это фактически возвращает ссылку на объект. Например, если вы перегрузите оператор [] в своем классе, вы можете использовать внутри класса (* this) [] вместо оператора []. – ypnos
Марк, ваш пример вводит в заблуждение. Попробуйте Foo & get_copy() {return * this; }. Тогда вы видите, что на самом деле * это СПИСОК. – ypnos