第十一章 使用类.docVIP

  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文档。上传文档
查看更多
第十一章 使用类不要返回指向局部变量或临时对象的引用或指针不要返回指向局部变量或临时对象的引用或指针。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。(引用不能为空且引用必须在声明是就被初始化 见补充材料)引用的真正用途是用来作为函数的参数,或返回类型。例,对于如下函数Stock doIt(Stock st){ return st;}Stock st1;Stock st2;doIt(st1).show(); //此处相当于直接写st1.show();st2 = doIt(st1); //相当于st2 = st1;关于函数调用中生成的临时变量问题:C++ 中函数参数传递(包括参数和返回值)有三种方式:值传递, 引用传递,和指针传递对于按值传递,函数参数将会创建一个临时变量。而在返回时,若也是按值返回,则也会创建一个临时变量。Stock doIt(Stock st) //一个副本被传进来{ return st; //又一个副本被传出来 } //共创建了两个临时对象而对于引用与指针 的方式,则不会创建副本,而是直接传递地址Stock doIt(Stock st) { return st; }// 没有产生任何临时对象, 此函数就相当于 st本身Stock doIt(Stock st) { return st; //只有一个临时对象被传出来 }//引入函数时没有临时对象,而 return时创建了一个临时对象操作符重载 重载限制:重载后的操作符必须至少有一个操作数是用户定义的类型。以防止用户为标准类型重载操作符使用操作符不能违反原来操作符的规则。即不能改变操作数的数目不能定义新的操作符有的操作符不能被重载大多数操作符能够通过成员或非成员函数进行重载。但下面操作符只能通过成员函数重载。 = , () , [] , -友元友元有3种:友元函数 友元类 友元成员函数为何需要友元? 在类重载二元操作符时常需要友元。例如Time 类,重载了 * 操作符,于是有:Time A; Time B;……A = B*2.75; //相当于 A = B.operator * (2.75)但对于 A = 2.75 * B 又如何应对呢?因为操作符重载可以在成员函数和非成员函数中进行,因此,此处利用非成员函数.其原型如下 Time operator * (double m, const Time t); //函数的第一个参数对应于操作符左边的操作数,而第二个参数对应于操作符右边的操作数 。即如此形式(m * t)又由于该函数可能会访问参数 t中的私有成员,因此应将该重载函数声明为Time类的友元函数。友元函数 创建友元函数:第一步:声明函数将函数的原型放在类声明中。 2. 在原型声明前加上关键字friend第二步:定义函数在类的外面,因为友元函数不是成员函数,因此不需要使用Time:: 限定符。另外,在定义中也不需要关键字friend简而言之,类的友元函数是非成员函数,但其访问权限与成员函数相同。示例:重载 操作符ostream operator (ostream os, const Time t){ os t.hour “hours” t.minute “minutes”; return os;} 类的自动转换和强制类型转换 当无法进行自动转换时,C++ 可以使用强制类型转换:int *p = (int * )10;上述语句将10强制转换为int指针类型(int *),将指针设置为地址10当类的构造函数有一个只有一个参数时,会有比较特殊的转换。如 Stonewt类,其中有一个构造函数如下Stonewt(double lbs);则可以如下来初始化对象Stonewt myCat;myCat = 19.6;上述代码将会使用Stonewt(double lbs)构造函数来创建一个临时的Stonewt对象,然后将该对象采用逐成员赋值的方式将该临时对象的内容复制到myCat中。(注意此处创建了一个临时对象)。(个人想法:类对象的构造方法,只会被调用一次。当该对象已经创建时,就不会再对他进行构造。如Stonewt myCat; 则myCat已经调用了其自身的默认构造函数,以后在程序中,不会在为其调用构造函数了。而其后采用myCat = 19.6来改变myCat这个对象时,会采用为myCat创建一个临时对象逐成员赋值的方式,来为myCat赋值。因此像这种情况下,必然会有临时变量的产生) 若想关闭这种转换,则需要为构造函数添加explict 关键字explict Stonewt(double lbs);此时隐式转换关闭,但仍允许显示转换Stonewt myCat;myCat = 19.6; //e

文档评论(0)

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

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

1亿VIP精品文档

相关文档