我了解this
的作用,但是*this
和this
之间有什么区别呢?
是的,我已经通过谷歌和我的教材阅读了*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
的值类别为prvalue。
当我们在类对象上调用非静态成员函数时,该对象的地址被隐式传递为该成员函数的第一个参数。这是可能的,因为每个非静态成员函数都有一个名为this
的隐式参数,对于非const成员函数,它的类型为X*
,而对于const成员函数,它的类型为const X*
,其中X
是某个类。
当我们在this
上应用*
时,结果是指针this
所指向的对象。我们基本上是对this
指针进行解引用。也就是说,*this
给出了我们调用非静态成员函数的对象。换句话说,我们得到了在其上调用非静态成员函数的对象。
此外,当作为表达式使用时,*this
的值类别为lvalue。另外,请注意:
表达式的类型永远不会是引用。
请注意,lvalue表达式与lvalue引用不同。答案由Marcelo Cantos和评论由cigien似乎混淆了这两个概念。
this |
*this |
---|---|
指向调用非静态成员函数的类对象的指针。 | 对this 指针进行解引用的结果。结果是实际上调用非静态成员函数的对象。 |
prvalue-expression | lvalue-expression |
实际上没有区别,this->foo()
和 (*this).foo()
是相同的。
Foo & get_copy() { return *this; }
将返回一个引用,因为您告诉它(通过声明Foo&)。而Foo get_copy() { return *this; }
将返回对象的副本,就像任何其他类型一样。 - tiftik&
以再次获取指针。 - newacct