c++對象成员函数返回自身引用.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c對象成员函数返回自身引用

c++对象成员函数返回自身引用时出现的诡异问题及解决办法 list.h (实际上是数据结构顺序表的一个例子,为了展现问题,我简化了部分代码,只留下插入和打印) #includeiostream using namespace std; class List { public: List(int max_list_size) { max_size=max_list_size; data=new int[max_size]; n=0; } ~List() { delete[]data; } bool empty()//const { return n==0; } int size() { return n; } List insert(int k,int x) { for(int i=n-1;i=k;i--) data[i+1]=data[i]; data[k]=x; //此处有值 coutdata inserted phaseendl; coutdata[0]=data[0]endl; n++; return *this; } void print_list() //const; { //此处没值 coutprint phaseendl; for(int i=0;in;i++) { coutdata[i]=data[i]endl; } } private: int n; int max_size; int *data; }; main函数 #includeiostream using namespace std; #includeList.h int main() { List list(5); int t; coutplease enter a integer and press enterendl; cint; couttendl; list.insert(0,t); list.print_list(); system(pause); return 0; } 运行时输入2 回车 结果如图 你能看出问题在哪里吗? 当我把成员函数insert的返回值类型 由 List 改为List 结果就正确了 下面我们分析下出现该问题的原因,以及应对方法 首先大家要了解的是函数的返回值的传递方式,这里大家应该牢记的是函数返回值的传递和函数传递参数的方式是基本一样的,关于函数传递参数的方式请参见C++指针存储结构。 函数返回值的传递也分为按值传递和按引用传递两种 示例代码中成员函数insert的函数原型为List insert(int k,int x) 为按值传递,所以在返回值实际上复制了一个新的对象x,那么这个新的对象和原有的调用该函数的对象(假设为l)有什么区别和联系? 要回答这个问题就要了解一下拷贝构造函数,拷贝构造函数会在函数按值传递参数或者按值传递返回值的时候调用;当类中没有拷贝构造函数时,会调用默认的拷贝构造函数。一般情况下,默认构造函数会对源对象的每个数据成员一一赋值给目标对象的同一数据成员,但如果数据成员包含指针,可能导致严重问题。 List list(5); int t; cint; list.insert(0,t); 当调用list.insert方法时,由于返回值是按值传递的,所以会调用默认拷贝构造函数复制一个新的对象(假设为x),但由于List类数据成员包含指针,会出现如下情况 目前好像看不出什么问题,接下来有问题了,由于该成员函数的返回对象x(实际上是临时对象)并没有赋给任何变量,所以会立即调用析构函数析构掉,析构函数的代码 ~List() { delete[]data; } 析构以后如图 此时对象l的data指针却还指向那块被释放掉了的区域,形成了“虚悬引用”,也就是俗称的“野指针”。所以也当查看对象l的data[0]是变成一个奇怪的值。 问题的解决是加上自己的拷贝构造函数 List(const List right):n(right.n),max_size(right.max_size) { data = new int [max_s

文档评论(0)

sheppha + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5134022301000003

1亿VIP精品文档

相关文档