链接同一对象的方法
我的工作类现在链接同一对象的方法
但有调用方法(这里的链的问题是代码
class Point{
public:
int x;
int y;
Point(int i , int j);
Point incrementX();
Point incrementY();
void print();
};
Point::Point(int i, int j){
x = i;
y = j;
}
Point Point::incrementX(){
x++;
return(*this);
}
Point Point::incrementY(){
y++;
return(*this);
}
void Point::print(){
cout << "(" << x << "," << y << ")" << endl;
}
void Q11(){
Point a(2,3);
//(3,4)
a.incrementX().incrementY().print();
//(3,3)why 33 here ??
a.print();
}
我很困惑,为什么最后一个代码a.print()
给人的(3,3)
,我尝试打印出来的方法
我里面的this
地址发现两个地址时,主叫incrementX()
和incrementY()
是不同
我的猜测是,incrementX()
访问类,但调用incrementY()
上课的时候被占用。因此,它使堆中类的副本,然后incrementY()
更改Y在副本...
所以(3,4)
被复制印刷,并(3,3)
是由实际的类印刷...
你incrementX
和incrementY
函数返回按值。这是说,在从这些函数返回的对象被复制等后续操作上不同的实例发生。
你可以看到发生在编译错误被你删除的拷贝构造函数。要做到这一点添加
Point(const Point&) = delete;
(假定C++ 11或更高的使用delete
如果旧的只是让私人)
所以诊断您的实际错误:
- 你构建
Point
与值(2,3)。 - 对
incrementX
的第一个电话会使用您的原始实例(现在的值为(3,3)),并在返回时传出一份副本。 -
incrementY
对临时副本进行操作并将其值更新为(3,4)。它也会返回一个副本。 - 您打印具有预期结果的第二个临时副本(3,4)。
- 现在
a.print()
显示您尚未因为调用感动incrementX
和显示器(3,3)原Point
。
为了利用链接的你想使用,你的所有操作都应该出现相同对象上实现,你应该从这些功能通过非const 参考返回。
函数签名
Point Point::incrementX()
成为
Point& Point::incrementX()
和完整的代码如下所示。
#include <iostream>
using namespace std;
class Point{
public:
int x;
int y;
Point(int i , int j);
//Point(const Point&) = delete;
Point& incrementX();
Point& incrementY();
void print();
};
Point::Point(int i, int j){
x = i;
y = j;
}
Point& Point::incrementX(){
x++;
return(*this);
}
Point& Point::incrementY(){
y++;
return(*this);
}
void Point::print(){
cout << "(" << x << "," << y << ")" << endl;
}
int main(){
Point a(2,3);
a.incrementX().incrementY().print();
a.print();
}
与删除的拷贝构造函数的代码编译罚款,因为没有副本发生。
只有a.incrementX()
递增成员值。 a.incrementX().incrementY()
增加一个临时实例并被丢弃。
替换点与Point&
在Point Point::incrementX()
功能,你会得到正确的结果。
thx!现在我明白了...... –
是的......我知道了...... thx! –