C++中的*this和this有什么区别?

53

我了解this的作用,但是*thisthis之间有什么区别呢?

是的,我已经通过谷歌和我的教材阅读了*this,但我还是不明白...

3个回答

91

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
我在这里进行验证:返回 *this 不会返回对象的引用,而是对象的一份拷贝? - anon235370
5
马克,你的例子是误导性的。试试这个:Foo& get_copy() { return this; }。然后你会发现,实际上this 是一个引用。 - ypnos
2
@ypnos:*这是一个取消引用的指针还是一个引用与此无关。Foo & get_copy() { return *this; }将返回一个引用,因为您告诉它(通过声明Foo&)。而Foo get_copy() { return *this; }将返回对象的副本,就像任何其他类型一样。 - tiftik
2
更准确地说,指针的解引用会产生一个lvalue,它引用了该对象。由于它是一个lvalue,因此您可以将其分配给引用变量并获取对其的引用;或者您可以将其分配给该对象类型的变量并获取副本,或者您可以对其执行&以再次获取指针。 - newacct
@MarkRushakoff:所以,当我们重载=(赋值)运算符时,它应该返回对象克隆的引用。对吗? - Destructor
显示剩余2条评论

2

案例1

this是指向调用非静态成员函数的类对象的指针。此外,当作为表达式使用时,this的值类别为prvalue

当我们在类对象上调用非静态成员函数时,该对象的地址被隐式传递为该成员函数的第一个参数。这是可能的,因为每个非静态成员函数都有一个名为this的隐式参数,对于非const成员函数,它的类型为X*,而对于const成员函数,它的类型为const X*,其中X是某个类。

案例2

当我们在this上应用*时,结果是指针this所指向的对象。我们基本上是对this指针进行解引用。也就是说,*this给出了我们调用非静态成员函数的对象。换句话说,我们得到了在其上调用非静态成员函数的对象。

此外,当作为表达式使用时,*this的值类别为lvalue。另外,请注意:

表达式的类型永远不会是引用。

请注意,lvalue表达式lvalue引用不同。答案由Marcelo Cantos和评论由cigien似乎混淆了这两个概念。

总结

this *this
指向调用非静态成员函数的类对象的指针。 this指针进行解引用的结果。结果是实际上调用非静态成员函数的对象。
prvalue-expression lvalue-expression

-8

实际上没有区别,this->foo()(*this).foo() 是相同的。


2
啊,是的,我应该先把它放进编译器中验证一下 :) - Chris Hafey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接