在以下类定义中:
#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
(而不是指向Test
:Test&
的指针类型)。 / p>
为什么是这样,它们不正确吗?
答案 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
之间的区别有关的部分已在其他答案中得到解决。让我们看一下返回Test
和Test&
之间的区别。
我相信
Test setX(int a) { x = a; return *this; }
也是正确的
考虑连锁店:
t.setX(1).setY(2);
如果set_
返回*this
(Test 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,也不能重新分配。