C语言试题、学习、考试大全33精品.pptVIP

  1. 1、本文档共171页,可阅读全部内容。
  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语言试题、学习、考试大全33精品

//重载双目–, 使其只有一个参数 (单目) , 返回指针类型 struct A{ int a; A (int x){ a=x; } }; class B{ A x; public: A *operator- ( ) { return x; }; //只有this, 故重载为单目 B (int v): x (v) { } }b (5) ; void main (void){ int i=b-a; //等价于下一条语句,i=b.x.a=5 i=b.operator - ( ) -a; //i=b.x.a=5 i= (*b.operator- ( )).a; //i= (*b.operator- ( ))-a= b.operator - ( ) -a } 编译程序为每个类提供了缺省赋值运算符函数,对类A而言,其成员函数原型为Aoperator= (const A) 。 如果类自定义或重载了赋值运算函数,则优先调用类自定义或重载的赋值运算函数(不管是否是取代型定义) 。 缺省赋值运算实现数据成员的复制或浅拷贝赋值,如果数据成员为指针类型,则未复制指针所指存储单元的内容。若类不包含指针成员,浅拷贝赋值不存在问题。 如果函数参数值参传递一个对象,当实参传值给形参时,若类A未定义A (const A)形式的构造函数,则值参传递通过浅拷贝赋值实现,可能出现内存泄露问题。 9.3 赋值与调用 当类包含指针时,浅拷贝赋值可造成内存泄漏,并可导致页面保护错误或产生变量副作用。 字符串 对象a int i char *p int j 对象b int i char *p int j 字符串 开始时, 对象a, b的指针p指向各自内存 字符串 对象a int i char *p int j 对象b int i char *p int j 字符串 浅拷贝赋值 b=a, 泄漏 #include string.h class STRING{ char *s; public: virtual char operator[ ] (int x) { return s[x]; } STRING (const char*c) {strcpy (s=new char[strlen(c)+1], c) ; } STRING (const STRING c) {strcpy (s=new char[strlen (c.s) +1], c.s); } virtual STRING operator+(const STRING)const;//不改参数 virtual STRINGoperator= (const STRING ); virtual STRINGoperator+=(const STRINGs) {return *this=*this+s; } virtual ~STRING ( ) { if (s) { delete [ ]s; s=0; }} } s1(S1), s2=S2, s3(S3); //s2=S2等价于是s2 (S2) STRING STRING::operator+(const STRING c)const{ char *t=new char[strlen (s)+strlen (c.s) +1]; STRING r(strcat (strcpy (t, s), c.s)); //strcpy、strcat返回t delete [ ]t; return r; } STRING STRING::operator=(const STRING cs){ delete [ ]s; strcpy (s=new char[strlen (cs.s) +1], cs.s) ;   return *this; } void main (void){ s1=s1+s2; s1+=s3; s3[0]=T; //调用char operator[ ] (int x) } 对于类T,防止内存泄露要注意以下几点: 不要随便使用exit和abort退出程序; 定义T (const T )等形式的深拷贝构造函数; 定义virtual T operator= (const T ) 等形式的深拷贝赋值运算符函数; 定义virtual ~T ( ) 形式的虚析构函数; 在定义引用T p=*new T ( )后,一定要使用delete p析构并释放对象占用的内存; 在定义指针T *

文档评论(0)

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

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

1亿VIP精品文档

相关文档