C++函数返回值发生的对象复制
来源:互联网 发布:数据透视表多条件筛选 编辑:程序博客网 时间:2024/05/01 03:14
最近用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
- C++函数返回值发生的对象复制
- C++函数返回值发生的对象复制
- 对象作为参数和返回值 复制(拷贝)构造函数
- c++的拷贝构造函数的思考(当返回对象时,发生什么)
- C函数的返回值
- c 函数的返回值
- 函数返回一个对象时要调用复制构造函数的原因
- C++中对象作为函数形参,返回值时,构造函数,复制构造函数,析构函数的调用顺序(1)
- 返回值为对象的函数识别
- 返回值为对象的函数
- C++13.1.2合成复制构造函数----定义复制对象时会发生什么
- 临时对象作为函数返回值返回的分析
- C#:复制对象的事例
- C++返回值为对象时复制构造函数不执行怎么破
- C++返回值为对象时复制构造函数不执行怎么办
- (C++)计算事件发生可能性的函数
- new发生异常的返回值
- C语言函数返回值的获取
- 爬虫实战——爬百思不得姐
- 自定义View(四) Graphics2D 实现动态效果
- pyHook, pythoncom编写键盘鼠标监控器
- c++常用知识点1
- hdu6140Hybrid Crystals(水)
- C++函数返回值发生的对象复制
- 第一个.NetCore 2.0程序
- Java微信公众平台开发之将本地开发环境映射到公网访问
- gridControl
- flex-layout Responsive API
- HDU6154-CaoHaha's staff
- sysConfig.bat 闪退问题及此处不应有 \Java\jdk1.7.0_79问题的解决
- 使用python的BeautifulSoup库解析页面应选择适当容错能力的解析器
- openoffice问题:conversion failed: could not save output document; OOo errorCode: 283