C++函数返回值发生的对象复制

最近用QT做一个监控系统的项目,需要显示目标的运动轨迹,每次目标移动后,就在目标的轨迹中(用vector记录)添加一条新轨迹。

但是在运行中画面里一直不出现轨迹,经过调试发现是记录轨迹的函数出错了。

原程序的逻辑是:目标轨迹类是ObjectTrack,通过调用getTrack()函数获得一个vector,然后将新的坐标append到vector里。

问题出现的原因在于,getTrack()方法返回的vector不是ObjectTrack对象的成员,因为在return的时候发生了vector的复制,所以对复制后的vector添加新坐标是不会被保存的。

解决办法1:

对返回后的vector进行添加新坐标后再set回ObjectTrack对象中

这个方法会产生额外的vector副本

解决办法2:

使用引用,将getTrack()函数的返回值设置成引用,并用引用变量接收

不会产生vector的副本,比解决办法1好

解决办法3:

在ObjectTrack中添加新的函数用于追加新坐标信息

符合封装性,使用也更简单,比1、2好

 

对于C++对象赋值操作(还有return对象)发生的复制现象,做了以下分析:

1.当函数返回值不是引用类型是,会发生复制,且接收函数返回值的变量不能是引用类型

#include <iostream>
using namespace std;

class C1
{
public:
	int a;
	C1(int a){
		this->a = a;
	}
	/*复制构造函数,不修改被拷贝的对象,所以参数为const;参数是引用,
	是因为如果不是引用,在传递参数的时候就会被调用复制构造函数,而这
	个函数本身就是复制构造函数,会造成无穷的递归调用
	*/
	C1(const C1 &c){
		this->a = c.a;
		cout << "copy constructor called" << endl;
	}
};
class C2
{
public:
	C1 c1;
	C2():c1(10){
	}
	C1 getC1(){
		return c1;
	}
};
int main(){
	C2 c2;
	C1 c1 = c2.getC1();
	cout<<(int)(&c1)<<endl<<(int)(&c2.c1)<<endl;
	return 0;
}

  运行结果是:

copy constructor called
2686712
2686716

 

2.当函数返回值是引用类型,接收函数返回值的变量不是引用时,仍然发生复制

#include <iostream>
using namespace std;

class C1
{
public:
	int a;
	C1(int a){
		this->a = a;
	}
	/*复制构造函数,不修改被拷贝的对象,所以参数为const;参数是引用,
	是因为如果不是引用,在传递参数的时候就会被调用复制构造函数,而这
	个函数本身就是复制构造函数,会造成无穷的递归调用
	*/
	C1(const C1 &c){
		this->a = c.a;
		cout << "copy constructor called" << endl;
	}
};
class C2
{
public:
	C1 c1;
	C2():c1(10){
	}
	C1 &getC1(){
		return c1;
	}
};
int main(){
	C2 c2;
	C1 c1 = c2.getC1();
	cout<<(int)(&c1)<<endl<<(int)(&c2.c1)<<endl;
	return 0;
}

  运行结果是:

copy constructor called
2686712
2686716

 

3.函数返回值是引用类型,接收函数返回值的变量是引用类型,不会发生复制

#include <iostream>
using namespace std;

class C1
{
public:
	int a;
	C1(int a){
		this->a = a;
	}
	/*复制构造函数,不修改被拷贝的对象,所以参数为const;参数是引用,
	是因为如果不是引用,在传递参数的时候就会被调用复制构造函数,而这
	个函数本身就是复制构造函数,会造成无穷的递归调用
	*/
	C1(const C1 &c){
		this->a = c.a;
		cout << "copy constructor called" << endl;
	}
};
class C2
{
public:
	C1 c1;
	C2():c1(10){
	}
	C1 &getC1(){
		return c1;
	}
};
int main(){
	C2 c2;
	C1 &c1 = c2.getC1();
	cout<<(int)(&c1)<<endl<<(int)(&c2.c1)<<endl;
	return 0;
}

运行结果是:

2686712

2686712

 

 

另外,数组返回值也会发生复制

String str = strs[i];

str与strs[i]也是不同的对象

转载于:https://www.cnblogs.com/AuroraMini/p/7398300.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值