版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、运算符重载运算符重载10. 运算符重载一般概念21. 运算符重载规则21.1. 允许重载的运算符21.2. 不允许重载的运算符21.3. 其他规则32. 运算符重载普通函数、友员函数和类成员函数33. 单目预算符、双目运算符重载54. 转换构造函数和类型转换运算符55. 赋值运算符的重载76. 下标运算符重载87. new和delete重载88. 指针运算符-的重载90. 运算符重载一般概念c+内部定义的数据类型(int , float, )的数据操作可以用运算符号来表示,其使用形式是表达式,用户自定义的类型的数据的操作则用函数表示,其使用形式是函数调用。为了是对用户自定义数据类型的数据的操作
2、与内定义的数据类型的数据的操作形式一致,c+提供了运算符的重载,通过把c+中预定义大的运算符重载为类的成员函数或者友员函数,使得对用户的自定义数据类型的数据对象的操作形式与c+内部定义的类型的数据一致。重载即赋予新的含义。运算符重载指对已知的运算符,在新的场合,通过程序实现新的行为。1. 运算符重载规则1.1. 允许重载的运算符表 1.1 允许重载的运算符双目运算符+ - * / %关系运算符= != =逻辑运算符| & +单目运算符+ - * &自增自减运算符+ -位运算符| & 赋值运算符= += -= *= /= %= &= |= = =空间申请和释放new delete new del
3、ete其他运算符() - -* , 1.2. 不允许重载的运算符不允许重载的运算符只有5个:.(成员访问符).*(成员指针访问运算符):(域运算符)sizeof(长度运算符)?:(条件运算符号)1.3. 其他规则 不允许自己定义新的运算符,只能对已有的运算符号进行重载; 重载不能改变运算符运算对象的个数,如和m_freal+cpx2.m_freal;cpxret.m_fimag=this-m_fimag+cpx2.m_fimag;return cpxret;3. 转换构造函数和类型转换运算符 类的转换构造函数只带一个参数,它把参数类型的的数据转换成相应类型的类的对象。这与拷贝构造函数不同,拷贝
4、构造函数的参数是同类型对象的引用。例如class ccomplexpublic:double m_freal;double m_fimag;ccomplex();ccomplex(double freal, double fimag=0)m_freal=freal;m_fimag=fimag;int main()ccomplex cpx;cpx=9;return 0;“px=9”一句将数值9转换成一个临时的ccomplex对象,并拷贝给cpx。与之相对应,可以通过转换运算符,将一个类的对象转换成其他类型的数据。对于类x,转换后的类型为t,则类型转换运算符的形式为:x:operator t()/
5、如class ccomplexpublic:double m_freal;double m_fimag;ccomplex();ccomplex(double freal, double fimag=0)m_freal=freal;m_fimag=fimag;operator double()return m_freal;int main()ccomplex cpx(2,3);double f=double(cpx);4. 流运行符的重载class complex;ostream operator(istream& is, complex& c);complex operator+(comple
6、x &first, complex &second );class complex public: complex()real=0;imag=0; complex(double r,double i)real=r;imag=i; /convert struct complex(double c)real = c; imag = 0; /convert operator operator double() return real; operator char*() char* s = (char*)malloc(100); /strcpy(s,value:(%d,%d); sprintf(s,v
7、alue:(%.2f,%.2f), real,imag); /string s = value:; /s = s+tt;/(;/+real+,+imag+); return s; friend complex operator+(complex &first, complex &second ); friend ostream operator(istream& is, complex& c); void display() cout(real,imagi)(istream& is, complex& c)coutinput a complex :nc.realc.imag ;return i
8、s;ostream operator(ostream& os, complex& c)oscomplex value is:(c.real,c.imag)endl;return os;int main() /+complex c1(3,5),c2(13,15),c3(23,25);complex c = c1+c2;c1 = c+2.5;c1 = 2.5+c;/complex cc,ccc;cinccccc;coutcccccendl; return 0;5. 前加+/-和后加+/-的重载前加+complex complex :operator+()return complex(+real,+
9、imag);后加+complex complex :operator+(int) /after +complex temp(*this);temp.real+;temp.imag+;return temp;6. 赋值运算符的重载缺省的赋值运算符是实行对象间的按位拷贝,如果类成员中含有指针类型的数据成员,一般应该将该类的赋值运算符重载,如:class cmystringprivate:char *m_pszdata;public:cmystring(char *pszdata);/构造函数cmystring(cmystring &objstr);/拷贝构造函数cmystring &operato
10、r=(cmystring &objstr);/重载=操作符cmystring &operator=(char *pszdata);/重载=操作符cmystring()delete m_pszdata;cmystring:cmystring(char *pszdata)m_pszdata=new charstrlen(pszdata)+1;strcpy(m_pszdata,pszdata);待添加的隐藏文字内容3cmystring:cmystring(cmystring &objstr)m_pszdata=new charstrlen(objstr.m_pszdata)+1;strcpy(m_p
11、szdata,objstr.m_pszdata);cmystring &cmystring:operator=(cmystring &objstr)if(this=&objstr)return *this;delete m_pszdata;m_pszdata=new charstrlen(objstr.m_pszdata)+1;strcpy(m_pszdata,objstr.m_pszdata);return *this;cmystring &cmystring:operator=(char *pszdata)delete m_pszdata;m_pszdata=new charstrlen(
12、pszdata)+1;strcpy(m_pszdata,pszdata);return *this;int main()cmystring s1=abc;cmystring s2=xyz;s1=123;s1=s2;return 0;7. 下标运算符重载标准情况下,运算符用于访问数组的元素。我们可以通过重载下标运算符为类运算符。使得可以象访问数组元素一样的访问对象中的数据成员。c+只允许把下标运算符重载为非静态的成员函数。下标运算符的定义形式为:t1 t:operator (t2);其中t1为希望返回的数据类型,t为类名,t2为下标,它可以是任意类型。如需访问第5节中的cmystring的某个字
13、符的话,在类中可声明重载运算符:char operator(int iindex);在外部定义该运算符重载函数char cmystring:operator(int iindex)if(iindexstrlen(m_pszdata)return m_pszdataiindex;return 0;8. new和delete重载通过重载new和delete,我们可以自己实现内存的管理策略。new和delete只能重载为类的静态运算符。而且重载时,无论是否显示指定static关键字,编译器都认为是静态的运算符重载函数。 重载new时,必须返回一个void *类型的指针,它可以带多个参数,但第一个参数
14、必须是size_t类型,该参数的值由系统确定。class ctest/.void *operator new(size_t nsize)cout”new called,size=”nsizevoid *pret=:new charnsize;return pret; 重载delete时必须返回void类型,它可以带有多个参数,但第一个参数必须是要释放的内存的地址,其类型为void *,如果重载delete时指定了第二个参数,第二个参数必须为size_t类型。接上:class ctest/.void *operator new(size_t nsize)cout”new called,size=”nsizevoid *pret=:new charnsize;return pret;void operator delete(void *pvoid)cout”delete called”的重载class cdatasetpublic:int getfield(int &ifieldvalue, const char *pszfieldname)/.return 0;class
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版高端制造行业股权三方转让及供应链管理合同
- 2024年货物搬运合同样本正式
- 2024年食品级原材料采购质量标准及追溯合同3篇
- 2024版VRF空调系统安装合同
- 2024年特定固定资产升级改造项目融资合同范本版B版
- 2024年高速公路轮胎养护与更换专业承包合同3篇
- 二零二五年度反担保抵押合同范本解读3篇
- 2025版绿色环保建筑用砖采购合同9篇
- 二零二五年度个人教育贷款抵押合同执行起诉状3篇
- 保证书手机自己保管
- 肿瘤病例随访调查表
- 游乐园、滑雪场、冰雪乐园建设合作协议
- 建设项目环境监理 环境监理大纲的编制 环境监理大纲的编制
- 粉末涂料有限公司检维修作业安全风险分级清单
- 【苏教版】2022-2023学年六年级数学上册期末试卷(及答案)
- 2023-2024学年连云港市灌云县四年级数学第一学期期末学业水平测试模拟试题含答案
- 湖南省怀化市鹤城区2023年数学三下期末监测试题含解析
- 项目工程安全管理责任区域划分表
- 2023年学校食堂审计发现问题整改报告3篇
- 教育培训学校(机构)课堂教学反馈表
- 2023年全国测绘生产成本费用定额
评论
0/150
提交评论