《C++运算符重载.doc》由会员分享,可在线阅读,更多相关《C++运算符重载.doc(11页珍藏版)》请在三一办公上搜索。
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=
15、”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 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);