运算符重载PPT.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
运算符重载PPT

ptr ? (c) 撤销对象p2后 图5.1 例5.10的浅层复制示意图 p1 Lin 调用了默认的赋值运算符函数,程序运行后,出现了所谓的“指针悬挂”现象。 2. 用深层复制解决指针悬挂问题 为了解决浅层复制出现的错误,必须显式地定义一个赋值运算符重载函数,使之不但拷贝数据成员,而且为对象p1和p2分配了各自的内存空间,这就是所谓的深层复制。 #includeiostream //例7.11 关于深层复制的例子。 using namespace std; class STRING{ public: STRING(char*s) { coutConstructor called.endl; ptr=new char[strlen(s)+1]; strcpy(ptr,s); } ~STRING() { coutDestructor called.-ptrendl; delete[]ptr;} STRING operator=(const STRING ); private: char *ptr; }; STRING STRING::operator=(const STRING s) { if (this==s)return *this; //防止s=s的赋值 delete []ptr; //释放掉原区域 ptr=new char[strlen(s.ptr)+1]; //分配新区域 strcpy(ptr,s.ptr); //字符串拷贝 return *this; } 声明赋值运算符重载函数 定义赋值运算符函数 int main() { STRING p1(book); STRING p2(jeep); p2=p1; return 0; } 调用自定义赋值运算符函数,深层复制 执行到右花括号,先撤消对象p2,后撤消对象p1 运行结果: Constructor called. Constructor called. Destructor called.-book Destructor called.-book 动态空间1 动态空间2 book jeep ptr p1 ptr p2 (a)执行p2=p1之前 book ptr ptr p1 p2 (b)执行p2=p1之后 jeep 说明: 类的赋值运算符“=”只能重载为成员函数,而不能把它重载为友元函数. book ptr 图5.2 例5.11的深层复制示意图 p1 (c) 撤销对象p2后 可见:调用了自定义的赋值运算符函数,程序执行了所谓的深层复制,运行结果是正确的。 在C++中,在重载下标运算符“[]”时,认为它是一个双目运算符,例如X[Y]可以看成: [] -----双目运算符 X -----左操作数 Y -----右操作数 operator[]-----对应的运算符函数名 ------------------------------------------- 若X为某一个类的对象,函数调用X[Y]可被解释为: X.operator[](Y) 左操作数 运算符函数名 右操作数 7.3.3 下标运算符“[]”的重载 类似X+Y可以看成: + -----双目运算符 X -----左操作数 Y -----右操作数 operator+--运算符函数名 类似X.operator+(Y) 下标运算符重载函数形式如下: 说明: (1)下标运算符“[ ]” 只能使用成员函数重载。 (2)形参只能有一个,形参在此表示下标。 返回类型 类名::operator[](形参) { //函数体 } #includeiostream.h //例7.13-1 #includestdlib.h class Vector4{ int v[4]; public: Vector4(int a1,int a2,int a3,int a4) { v[0]=a1;v[1]=a2;v[2]=a3;v[3]=a4;} int operator[](int bi); }; int Vector4::operator[](int bi) {if (bi0||bi=4) {coutBad subscri

文档评论(0)

djdjix + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档