\*this vs this in C

新手上路,请多包涵

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

是的,我已经在我的教科书中搜索并阅读了 *this ,但我就是不明白……

原文由 anon235370 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 625
2 个回答

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

您可以看到,当我们对本地对象的 副本 进行操作时,更改不会持续存在(因为它完全是一个不同的对象),但是对引用或指针进行 操作确实会 保持更改。

原文由 Mark Rushakoff 发布,翻译遵循 CC BY-SA 2.5 许可协议

情况1

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

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

案例2

当我们在 * this ,结果是指针 this 指向的对象。我们基本上是在 取消引用 this 指针。也就是说, *this 为我们提供了指针 this 指向的对象。换句话说,我们得到了调用非静态成员函数的对象。

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

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

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

概括

this*this指向调用非静态成员函数的类的对象的指针。取消引用 this 指针的结果。结果是调用非静态成员函数的实际对象。 prvalue 表达式左值表达式

原文由 Jason Liam 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏