【发布时间】:2021-10-11 01:03:16
【问题描述】:
我正在了解这个指针,它包含正在调用该函数的当前对象的地址。但是当我从成员函数返回当前对象时,我对这个指针有疑问。
#include<bits/stdc++.h>
using namespace std;
class Point
{
private:
int x,y;
public:
Point(int x,int y)
{
this->x = x;
this->y = y;
//cout<<this<<endl;
}
Point setX(int x)
{
this->x = x;
//cout<<this<<endl;
return *this;
}
Point setY(int y)
{
this->y = y;
//cout<<this<<endl;
return *this;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
};
int main()
{
Point p(10,20);
cout<<p.getX()<<" "<<p.getY()<<endl;
p.setX(1000).setY(2000);
cout<<p.getX()<<" "<<p.getY();
return 0;
}
为什么 p.setX(1000).setY(2000) 只修改 x 的值,不修改 y? 为什么第二个 cout 语句的答案是 1000 20 但应该是 1000 2000?
【问题讨论】:
-
setX和setY返回它们的点按值,而不是通过引用。这意味着当您return *this时,您会返回您正在调用该方法的对象的副本。 -
您返回的是按值的对象,而不是按引用。
Point包含*this的副本。如果您希望链接您的操作,则返回类型应为Point&。 -
请注意,通常像
setX(int)和setY(int)这样的 setter 方法根本不返回任何内容,即它们的返回类型通常是void。让他们返回Point是合法的 C++,但它会让人们感到困惑。 -
@JeremyFriesner:两种风格的 setter 都很常用(坦率地说,我都不喜欢)。
-
我想说,对于像 2D 点这样无处不在且简单的东西,使用 getter 和 setter 将其封装在私有数据中似乎有点过头了。为什么不让成员公开并完成它?