一个小测试程序(返回对象的引用和返回对象)如题

Robin_cpp 2013-05-10 06:25:10
#include <iostream.h>

class point
{
public:
point() : x(0),y(0){}
point(point &p)
{
this->x=p.x;
this->y=p.y;
}
void move(int xx,int yy)
{
this->x+=xx;
this->y+=yy;
}
void show()
{
cout<<"("<<this->x<<","<<this->y<<")"<<endl;
}
private:
int x;
int y;
};
//point的封装
class ArrayPoint
{
public:
ArrayPoint(int iArraySize)
{
this->size=iArraySize;
this->pPoint=new point[iArraySize];
}
~ArrayPoint()
{
delete [] pPoint;
}

/**************************************************************************************
问题如下:1,返回point,即point operator [](int index),此时point[0].show()显示结果为(0,0)
2,返回&point,即point &operator [](int index),此时point[0].show()显示结果为(10,10)
预期值为显示结果为(10,10) ,但是为什么第一个返回对象就不行,不能移动指定的点呢?
请见解深刻的大虾帮忙解答返回这两个形式对后续操作的影响和注意,效率方面就不要讲了,
返回引用肯定效率高现在的问题就是第一种为什么得不到预期的结果。
请将下面代码point &operator [](int index)改为point operator [](int index)运行并解答之!
*****************************************************************************************/
//重载[]操作符
point &operator [](int index)
{
return pPoint[index];
}
private:
point *pPoint;
int size; //对象数组的容量

};
int main()
{
ArrayPoint point(10);
point[0].move(10,10);
point[0].show();

return 0;
}
...全文
101 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Robin_cpp 2013-05-10
  • 打赏
  • 举报
回复
引用 6 楼 FireBurn 的回复:
引用 4 楼 Robin_cpp 的回复:
引用 3 楼 starytx 的回复:
引用 2 楼 Robin_cpp 的回复:
[quote=引用 1 楼 starytx 的回复:] 返回对象的话只是一个临时的对象而不是类对象本身了,返回引用才是本身
你的意思是move函数没有操作到point(0)?
不是,你的[]操作符返回对象的话,返回一个ArrayPoint类成员的一个元素,函数其实是生成一个point的副本,这个副本的值和你返回的那个数组元素一样,也就是说你的[]操作返回的是一个副本而不是类成员本身,所以[].move就操作不到本身了,总是那个副本。如果返回引用那么就是本身了,就正确了
那我就有一个疑问了,既然返回了副本,但是我在point里面添加复制构造函数,测试发现并没有在main()函数中调用到point类的复制构造函数,不是说返回临时对象编译器会点用复制构造函数来保存整个临时对象的吗?
没有调用到拷贝构造函数吗?
#include "stdafx.h"
#include <iostream.h>

class point
{
public:
	point() : x(0),y(0){cout<<"构造函数"<<endl;}
	point(point &p)
	{
		this->x=p.x;
		this->y=p.y;
		cout<<"拷贝构造函数"<<endl;
	}
	~point(){cout<<"析构函数"<<endl;}
	void move(int xx,int yy)
	{
		this->x+=xx;
		this->y+=yy;
	}
	void show()
	{
		cout<<"("<<this->x<<","<<this->y<<")"<<endl;
	}
private:
	int x;
	int y;
};
//point的封装
class ArrayPoint
{
public:
	ArrayPoint(int iArraySize)
	{
		this->size=iArraySize;
		this->pPoint=new point[iArraySize];
	}
	~ArrayPoint()
	{
		delete [] pPoint;
	}

        //重载[]操作符
	point operator [](int index)
	{
		return pPoint[index];
	}
private:
	point *pPoint;	
	int size;			//对象数组的容量

};


int main(int argc, char* argv[])
{
	ArrayPoint point(1);
	point[0].move(10,10);
	point[0].show();

	return 0;
}
输出
构造函数
拷贝构造函数
析构函数
拷贝构造函数
(0,0)
析构函数
析构函数
[/quote]哎 失误 失误!调用了 问题解决了
derekrose 2013-05-10
  • 打赏
  • 举报
回复
如果返回value的话,那么你是在给一个临时变量赋值
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
返回对象的话只是一个临时的对象而不是类对象本身了,返回引用才是本身
+1
FireBurn 2013-05-10
  • 打赏
  • 举报
回复
引用 4 楼 Robin_cpp 的回复:
引用 3 楼 starytx 的回复:
引用 2 楼 Robin_cpp 的回复:
引用 1 楼 starytx 的回复:
返回对象的话只是一个临时的对象而不是类对象本身了,返回引用才是本身
你的意思是move函数没有操作到point(0)?
不是,你的[]操作符返回对象的话,返回一个ArrayPoint类成员的一个元素,函数其实是生成一个point的副本,这个副本的值和你返回的那个数组元素一样,也就是说你的[]操作返回的是一个副本而不是类成员本身,所以[].move就操作不到本身了,总是那个副本。如果返回引用那么就是本身了,就正确了
那我就有一个疑问了,既然返回了副本,但是我在point里面添加复制构造函数,测试发现并没有在main()函数中调用到point类的复制构造函数,不是说返回临时对象编译器会点用复制构造函数来保存整个临时对象的吗?
没有调用到拷贝构造函数吗?
#include "stdafx.h"
#include <iostream.h>

class point
{
public:
	point() : x(0),y(0){cout<<"构造函数"<<endl;}
	point(point &p)
	{
		this->x=p.x;
		this->y=p.y;
		cout<<"拷贝构造函数"<<endl;
	}
	~point(){cout<<"析构函数"<<endl;}
	void move(int xx,int yy)
	{
		this->x+=xx;
		this->y+=yy;
	}
	void show()
	{
		cout<<"("<<this->x<<","<<this->y<<")"<<endl;
	}
private:
	int x;
	int y;
};
//point的封装
class ArrayPoint
{
public:
	ArrayPoint(int iArraySize)
	{
		this->size=iArraySize;
		this->pPoint=new point[iArraySize];
	}
	~ArrayPoint()
	{
		delete [] pPoint;
	}

        //重载[]操作符
	point operator [](int index)
	{
		return pPoint[index];
	}
private:
	point *pPoint;	
	int size;			//对象数组的容量

};


int main(int argc, char* argv[])
{
	ArrayPoint point(1);
	point[0].move(10,10);
	point[0].show();

	return 0;
}
输出
构造函数
拷贝构造函数
析构函数
拷贝构造函数
(0,0)
析构函数
析构函数
bluewanderer 2013-05-10
  • 打赏
  • 举报
回复
拷贝构造函数应该是point(const point &)
Robin_cpp 2013-05-10
  • 打赏
  • 举报
回复
引用 3 楼 starytx 的回复:
引用 2 楼 Robin_cpp 的回复:
引用 1 楼 starytx 的回复:
返回对象的话只是一个临时的对象而不是类对象本身了,返回引用才是本身
你的意思是move函数没有操作到point(0)?
不是,你的[]操作符返回对象的话,返回一个ArrayPoint类成员的一个元素,函数其实是生成一个point的副本,这个副本的值和你返回的那个数组元素一样,也就是说你的[]操作返回的是一个副本而不是类成员本身,所以[].move就操作不到本身了,总是那个副本。如果返回引用那么就是本身了,就正确了
那我就有一个疑问了,既然返回了副本,但是我在point里面添加复制构造函数,测试发现并没有在main()函数中调用到point类的复制构造函数,不是说返回临时对象编译器会点用复制构造函数来保存整个临时对象的吗?
starytx 2013-05-10
  • 打赏
  • 举报
回复
引用 2 楼 Robin_cpp 的回复:
引用 1 楼 starytx 的回复:
返回对象的话只是一个临时的对象而不是类对象本身了,返回引用才是本身
你的意思是move函数没有操作到point(0)?
不是,你的[]操作符返回对象的话,返回一个ArrayPoint类成员的一个元素,函数其实是生成一个point的副本,这个副本的值和你返回的那个数组元素一样,也就是说你的[]操作返回的是一个副本而不是类成员本身,所以[].move就操作不到本身了,总是那个副本。如果返回引用那么就是本身了,就正确了
Robin_cpp 2013-05-10
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
返回对象的话只是一个临时的对象而不是类对象本身了,返回引用才是本身
你的意思是move函数没有操作到point(0)?
starytx 2013-05-10
  • 打赏
  • 举报
回复
返回对象的话只是一个临时的对象而不是类对象本身了,返回引用才是本身

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧