欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    C++运算符重载.doc

    • 资源ID:2385616       资源大小:56.50KB        全文页数:11页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C++运算符重载.doc

    运算符重载运算符重载10. 运算符重载一般概念21. 运算符重载规则21.1. 允许重载的运算符21.2. 不允许重载的运算符21.3. 其他规则32. 运算符重载普通函数、友员函数和类成员函数33. 单目预算符、双目运算符重载54. 转换构造函数和类型转换运算符55. 赋值运算符的重载76. 下标运算符重载87. new和delete重载88. 指针运算符->的重载90. 运算符重载一般概念C+内部定义的数据类型(int , float, )的数据操作可以用运算符号来表示,其使用形式是表达式,用户自定义的类型的数据的操作则用函数表示,其使用形式是函数调用。为了是对用户自定义数据类型的数据的操作与内定义的数据类型的数据的操作形式一致,C+提供了运算符的重载,通过把C+中预定义大的运算符重载为类的成员函数或者友员函数,使得对用户的自定义数据类型的数据对象的操作形式与C+内部定义的类型的数据一致。重载即赋予新的含义。运算符重载指对已知的运算符,在新的场合,通过程序实现新的行为。1. 运算符重载规则1.1. 允许重载的运算符表 1.1 允许重载的运算符双目运算符+ - * / %关系运算符= != < > <= >=逻辑运算符| && +单目运算符+ - * &自增自减运算符+ -位运算符| & << >>赋值运算符= += -= *= /= %= &= |= = <<= >>=空间申请和释放New delete new delete其他运算符() -> ->* , 1.2. 不允许重载的运算符不允许重载的运算符只有5个:.(成员访问符).*(成员指针访问运算符):(域运算符)sizeof(长度运算符)?:(条件运算符号)1.3. 其他规则ü 不允许自己定义新的运算符,只能对已有的运算符号进行重载;ü 重载不能改变运算符运算对象的个数,如>和<是双目运算符,重载后仍为双目运算符,需要两个参数;ü 重载不能改变运算符的结合性,如=是从右至左,重载后仍然为从右至左;ü 重载不能改变运算符的优先级别,例如* / 优先于 -,那么重载后也是同样的优先级别;ü 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数,与第2条矛盾;ü 重载的运算符必须和用户的自定义数据类型一起使用,其参数至少应有一个是类对象(或者类对象的引用),或者说参数不能全部是C+的标准类型;ü 运算符重载函数可以是类的成员函数,也可以是类的友员函数,也可以使普通函数。2. 运算符重载普通函数、友员函数和类成员函数对同一个运算符号,往往可以通过几种方式实现重载,实现同样第功能。如有下列复数类:class CComplexpublic:double m_fReal;double m_fImag;char m_szStatus32;CComplex()m_fReal=0;m_fImag=0;CComplex(double fReal,double fImage)m_fReal=fReal;m_fImag=fImage;如果要实现将该类的两个对象的实部间相加、虚部间相加生成一个新的对象,即对象3对象2对象1;1. 如果用普通函数的实现运算符+的重载,可以用如下形式CComplex operator+(const CComplex &cpx1,const CComplex &cpx2)CComplex cpxRet;cpxRet.m_fReal=cpx1.m_fReal+cpx2.m_fReal;cpxRet.m_fImag=cpx1.m_fImag+cpx2.m_fImag;return cpxRet;2. 由于为类重载运算符函数往往要访问类的成员,而类为了封装性的需要,往往将成员声明为非公有的,因此往往将一个运算符函数重载为类的成员函数或者友员函数。如果CComplex的m_fReal,m_fImag是类的私有或者保护成员,那么普通函数无法访问,在此情况下就不能实现上述重载功能,此时,可以通过友员函数的方式实现运算符的重载。如下声明方式,可以在类中声明友员函数上面的普通函数为友员函数class CComplexpublic:double m_fReal;double m_fImag;char m_szStatus32;CComplex()m_fReal=0;m_fImag=0;CComplex(double fReal,double fImage)m_fReal=fReal;m_fImag=fImage;friend CComplex operator+(const CComplex &cpx1,const CComplex &cpx2);函数的实现与普通函数相同。3. 也可以将运算符重载为类的成员函数,如下class CComplexpublic:double m_fReal;double m_fImag;char m_szStatus32;CComplex()m_fReal=0;m_fImag=0;CComplex(double fReal,double fImage)m_fReal=fReal;m_fImag=fImage;CComplex operator+(const CComplex &cpx);并在类外定义该成员函数:CComplex CComplex:operator+(const CComplex &cpx2)CComplex cpxRet;cpxRet.m_fReal=this->m_fReal+cpx2.m_fReal;cpxRet.m_fImag=this->m_fImag+cpx2.m_fImag;return cpxRet;3. 转换构造函数和类型转换运算符² 类的转换构造函数只带一个参数,它把参数类型的的数据转换成相应类型的类的对象。这与拷贝构造函数不同,拷贝构造函数的参数是同类型对象的引用。例如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()/如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<<(ostream& os, Complex& c);istream operator>>(istream& is, Complex& c);Complex operator+(Complex &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,"Value:(%.2f,%.2f)", real,imag); /string s = "Value:" /s = s+"tt"/'('/+real+","+imag+")" return s; friend Complex operator+(Complex &first, Complex &second ); friend ostream operator<<(ostream& os, Complex& c);friend istream operator>>(istream& is, Complex& c); void display() cout<<"("<<real<<","<<imag<<"i)"<<endl; private: double real; double imag; ;Complex operator+(Complex &first, Complex &second )return Complex(first.real+second.real,first.imag+second.imag);istream operator>>(istream& is, Complex& c)cout<<"input a complex :n"<<endl;is>>c.real>>c.imag ;return is;ostream operator<<(ostream& os, Complex& c)os<<"complex 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;cin>>cc>>ccc;cout<<cc<<ccc<<endl; return 0;5. 前加+/-和后加+/-的重载前加+Complex Complex :operator+()return Complex(+real,+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 &operator=(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_pszData,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(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的某个字符的话,在类中可声明重载运算符:char operator(int iIndex);在外部定义该运算符重载函数char CMyString:operator(int iIndex)if(iIndex<strlen(m_pszData)return m_pszDataiIndex;return 0;8. new和delete重载通过重载new和delete,我们可以自己实现内存的管理策略。new和delete只能重载为类的静态运算符。而且重载时,无论是否显示指定static关键字,编译器都认为是静态的运算符重载函数。² 重载new时,必须返回一个void *类型的指针,它可以带多个参数,但第一个参数必须是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”<<endl;:delete pVoid;² 一个类可以重载多个new运算符,但是只能重载一个delete类运算符。9. 指针运算符->的重载class CDataSetpublic:int GetField(int &iFieldValue, const char *pszFieldName)/.return 0;class CDataSetPtrprivate:CDataSet *m_pDataSet;public:CDataSetPtr()m_pDataSet=new CDataSet;CDataSetPtr()delete m_pDataSet;CDataSet * operator->()return m_pDataSet;void main()CDataSetPtr pDataSet;int iValue;pDataSet->GetField(iValue,"Title");

    注意事项

    本文(C++运算符重载.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开