- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.对于公有派生,基类的protected成员在派生类中依然保持protected属性。 2.对于私有派生,基类的protected成员在派生类中变成了private成员,此时基类的protected成员就再也无法在派生类的派生类中被直接访问了。在继承或派生链中,一旦出现私有继承,则父类的成员的“类内直接访问特性”就无法在后面的派生中传递下去。 3.对于保护派生,基类的protected成员在派生类中依然保持protected属性,此时情况与公有派生类似。 类中protected成员的优点是:既可以在本类中实现数据的隐藏(在类外不可被直接访问),又可以将其类内直接访问特性传递到派生类中(在派生类中可直接访问)。但private成员只能实现本类中的数据隐藏,而不能将其类内直接访问特性传递到派生类中。 7.对于+=(或=)运算符,返回本类对象与返回本类对象的引用的区别 比较下面两例,先看第一个例子: Complex Complex ::operator+=(const Complex c) { Real+=c.Real; Image+=c.Image; return *this; } 此函数的返回值为本类对象,C++的处理是:用返回的对象值*this初始化内存临时对象(调用拷贝构造函数),从本函数返回后,用内存临时对象作为调用函数的结果。 再看第二个例子: Complex Complex ::operator+=(const Complex c) { Real+=c.Real; Image+=c.Image; Complex temp = *this ; return temp; } C++的处理是:调用拷贝构造函数,用返回的对象值temp初始化内存临时对象,内存临时对象作为调用函数的结果。 从上面两个小例子可以看出,若重载函数返回对象值,则返回*this和返回temp均可。 但要注意,因为返回对象值时需要调用拷贝构造函数初始化内存临时对象,因此若对象有动态分配的存储空间,就必须定义拷贝构造函数。 第三个例子: Complex Complex ::operator+=(const Complex c) { Real+=c.Real; Image+=c.Image; return *this; } 本例的返回值为本类对象的引用,不需初始化内存临时对象,返回值是对象自身,即*this。因为不需要初始化内存临时对象,效率较高,所以像 +=、= 等改变对象值的重载函数最好返回对象的引用。 第四个例子: Complex Complex ::operator+=(const Complex c) { Real+=c.Real; Image += c.Image; Complex temp = *this ; return temp; } 此时,出现问题。因为返回的是对象的引用(即对象自身,不借助于内存临时对象),系统要求在执行流程返回到调用处时,返回值是存在的。但是本例返回值是函数内部的局部对象temp,而局部对象在函数返回前,其空间是被撤消的。 结论: 返回本类对象时,可以用对象自身和局部对象做为返回值(有时需要定义拷贝构造函数)。 返回对象的引用时,不能用局部对象做为返回值。 [例16.8]对于字符串类,重载 = 运算符,返回对象自身的引用。就本例而言,可以不定义拷贝构造函数,程序能正确运行。 见 “第13章 多态性(例子).doc” 8.调用拷贝构造函数 和 调用赋值运算符重载函数的时机 class Complex { double Real, Image; public: Complex(double r=0, double i=0) // 构造函数 { Real=r; Image=i; } Complex(Complex c) // 拷贝构造函数 { Real=c.Real; Image=c.Image; coutCall copy Real Image\n; } }; void main( ) { Complex c1(2, 3), c2(4, -2); Complex c3=c1; c1=c2; } 程序的运行结果是? ←调用了拷贝构造函数 ←未调用拷贝构造函数 Call copy 2 3 只有在产生新对象时,调用构造函数。 用已有对象初始化新产生的对象时, 调用拷贝构造函数。 赋值运算 = , 不调用拷贝构造函数。 16.2.3 类型转换函数-将本类对象转换成其他类对象 例: Comple
文档评论(0)