C语言程序的设计解读.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在 String 中增加如下的拷贝构造函数,实现“深层复制” : String::String(String s){ p=new char[strlen(s.p)+1]; strcpy(p,s.p); }; 这样,执行同样的语句序列的效果是: “深层复制”示意 T h i s i s a s t r i n g T h i s i s a s t r i n g p s2 p s1 如果定义了专门的拷贝构造函数,一般也就需要重载专门的赋值操作符。 例如,String 中就应重载赋值操作符 = 如下: String String::operator = (const String s){ if(p) delete []p; p=new char[strlen(s.p)+1]; strcpy(p,s.p); return *this; }; 六、关于操作符的特性 操作数个数 优先级和结合性 是否要求第一操作数必须是变量或视同变量的数据 是否有副作用 (是否修改第一操作数) 操作结果是否为视同变量的数据 (是否就是第一操作数) 视同常量 + - == … 其他 视同变量 任意 * 间接访问 无 取地址 -- 后减1 视同常量 ++ 后增1 += *= … 复合赋值 = 赋值 -- 前减1 视同变量 有 变量 或 视同变量 ++ 前增1 操作结果 副作用 第一操作数 操作符 操作名称 七、关于操作符重载 应保持操作符原有的基本语义,重载的操作符应体现为原操作符功能在新的数据类型中的延伸 应尽量保持操作符原有的特性 优先级、结合性和操作数个数这三个特性自动得以保持 +=、*=、++(前增1)等操作符要求第一操作数必须是变量;当作为非成员函数重载这类操作符时,为了达到同样效果,第一参数应说明为引用 =、+=、*=、++等具有副作用的操作符,除后增1、后减1之外,其操作结果视同变量。当重载这类操作符时,为了达到同样效果,返回值应说明为引用,return 语句应返回第一参数(对于非成员函数重载),或返回*this(对于成员函数重载) 例如,例 8.1 的 Fraction 类(分数类)中重载了前增1操作符: Fraction opertor++(){ nume+=deno; return *this; } 因此执行 Fraction x(2,3); ++++x; 后,x 变为 8/3 操作符的重载应当配套 如果重载了+、-,应考虑同时重载 ++、-- 如果重载了==,应应考虑同时重载!= 如果重载了,应应考虑同时重载 …… 作为成员函数重载还作为非成员函数重载? 某些操作符只能作为成员函数重载,包括:=、[ ]、( )、 -以及所有类型转换操作符 。 若第一操作数不是同类对象,而是其他数据类型,则只能作为非成员函数重载(如输入输出流操作符 和 )。 其他情况既可作为成员函数,也可作为非成员函数重载。 作为非成员函数重载时,可将其声明为友元。 使用引用参数还是非引用参数? 使用引用参数可减少参数传递过程中的数据复制量 如果操作符作为非成员函数重载,且该操作符要修改第一操作数(如+=),则代表第一操作数的第一参数必须是引用参数 使用非引用参数可利用只需一个实参的构造函数实现类型的自动转换 例:例 8.1 中 增加构造函数: Fraction(int n=0,int d=1) :num(n),deno(d){ FracSimp(); } 类中已重载+,原形是: Fraction operator+(Fraction); 因此可以完成下面的运算: Fraction x,y(2,5); x=y+Fraction(2); 但如使用非引用参数,后一句也可改为: x=y+2; 知识回顾Knowledge Review * * * * * * * * 《 C++语言程序设计》 一、关于函数原形和头文件 函数的定义和函数的原型 例: double cubic(double d){ //定义 return d*d*d; } double cubic(double d); //原形 函数原形提供了生成函数调用代码所必须的接口信息,因此: 在函数的调用处之前,需通过函数原形提供该调用函数的接口信息。 函数定义也能提供同样的接口信息,因此: 如果函数的定义出现在函数调用处之前,函数原形即可省略。 但是,通过函数定义来担负函数原形的任务存在着下列问题: 函数的定义必须出现在函数调用的同一文件中,限制了函数的使用范围; 函数定义必须以源程序的形式呈现,不便于将之作为产品提供; 不便于实现大系统,不便于分工。 应

文档评论(0)

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

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

1亿VIP精品文档

相关文档