使用“ this”的成员函数的返回值

时间:2019-12-09 18:53:31

标签: c++ object

在以下类定义中:

#include<iostream> 

class Test 
{ 
private: 
  int x; 
  int y; 

public: 
  Test(int x = 0, int y = 0) { this->x = x; this->y = y; } 
  Test &setX(int a) { x = a; return *this; } 
  Test &setY(int b) { y = b; return *this; } 
  void print() { cout << "x = " << x << " y = " << y << endl; } 

}; 

我不明白为什么要在*this函数的setX前面放置setY。我知道this是指向当前对象的指针,而*返回指向的对象,但是由于函数的返回值中有&,这意味着函数返回一个对Test对象的引用。然后,返回变量也不应是引用(即指针),例如:

Test &setX(int a) { x = a; return this; }

我相信,

Test setX(int a) { x = a; return *this; }

也是正确的,因为返回值不是指针,而是指向对象,类型为Test(而不是指向TestTest&的指针类型)。 / p>

为什么是这样,它们不正确吗?

4 个答案:

答案 0 :(得分:3)

  

然后,返回变量也不应是引用(即指针),例如:

Test &setX(int a) { x = a; return this; }

那将是编译器错误。 this是一个指针。无法将其转换为引用类型Test&。但是,当取消引用this时,它可以用作引用类型Test&

 This& temp = this;   // An error.
 This& temp = *this;  // OK

将您的功能重新想象为:

Test &setX(int a)
{
   x = a;
   // This& temp = this;  // Error
   This& temp = *this;    // OK
   return temp;
}

答案 1 :(得分:2)

this*this之间的区别有关的部分已在其他答案中得到解决。让我们看一下返回TestTest&之间的区别。

  

我相信Test setX(int a) { x = a; return *this; }也是正确的

考虑连锁店:

t.setX(1).setY(2);

如果set_返回*thisTest setX(int);)的副本,而不返回引用(Test& setX(int);),则链接将不起作用,因为setY将修改该副本,而不是t本身。 ;之后,副本将被销毁,分配结果y = 2将丢失。

如果不需要链接,只需将set_设置为void

void setX(int a) { x = a; }

答案 2 :(得分:1)

有两个部分:

Test& setX(int a);是一个函数setX,它向<{1}返回一个 reference 。您可以将其视为一个指针,该指针在所有使用位置都已取消引用。

因此,您不能返回指针,而必须返回Test,即Test&

答案 3 :(得分:1)

在C ++中,您不能使用指针初始化引用。因此,这个(您正确地说是一个指针)已被取消引用。

还请记住,指针和引用不相同!指针包含一个地址,可以为NULL,也可以重新分配。引用是“对象的另一个名称”,不能为NULL,也不能重新分配。