【问题标题】:Returning this pointer when the return type of a function is a reference (C++)当函数的返回类型是引用时返回此指针 (C++)
【发布时间】:2021-01-11 16:02:35
【问题描述】:

有一个非常相似的问题here 但我不明白以下内容:

假设我有一个用于 2D 数学向量的类,我想定义 setter 函数:

/** Setters **/
Vector2D& setX(double xcoor) {x = xcoor; return *this;}
Vector2D& setY(double ycoor) {y = ycoor; return *this;}

现在,“this”指针包含调用函数的实例的地址。

Vector2D VV(2,4);
VV.setX(1).setY(5);

在这种情况下,“this”具有 VV 实例的地址。那么为什么不直接返回 this 而返回 *this 呢?

【问题讨论】:

  • 因为函数返回一个引用,this是一个指针,*this是一个引用。指针不是引用。
  • 但是 *this 意味着取消引用指针,以便获得指针指向的对象。对吗?
  • 是的,然后您返回对该对象的引用。
  • 是的 *this 取消引用一个指针。但是取消引用是一个计算机科学术语,它允许仅在给定内存地址的情况下对对象进行操作。指针不是它指向的对象——它是一个包含对象内存地址的变量。取消引用指针是指使用指针来操作(或访问)指针指向的对象。这并不意味着“获取指针指向的对象”,尽管有时看起来是这样。因此,取消引用指针可以产生引用。但是引用和指针是不同的概念。
  • @Peter 好的,这个答案对我有帮助。谢谢。

标签: c++ class reference this-pointer


【解决方案1】:

在这种情况下,“this”具有 VV 实例的地址。

没错。

那么为什么不直接返回 this 而返回 *this 呢?

假设setX 会返回指针

Vector2D* setX(double xcoor) {x = xcoor; return this;}
      //^--- no reference but pointer        ---^

那么你的代码就错了:

Vector2D VV(2,4);
VV.setX(1).setY(5);
    //    ^ ---------  error object has no class type, you cannot use .

“正确”是VV.setX(1)->setY(5);。但是,没有理由使用指针。我知道初学者可能很难理解,因为在教学中过度使用了指针。大多数时候你并不关心指针或对象的内存地址。

您返回*this,因为这就是启用链接所需的全部内容。调用者有一个VV 对象,所以您返回的是对该对象的引用,而不是其他东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2018-12-08
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多