C++重载运算符

#include "iostream" using namespace std; class MyInt { public: int a; int b; public: MyInt(){ a=0; b=0; cout<<"默认构造函数"<<endl; } MyInt(int ia,int ib){ a=ia; b=ib; cout<<"有值构造函数"<<endl; } MyInt(const MyInt& temp){ a=temp.a; b=temp.b; cout<<"拷贝构造函数"<<endl; } MyInt& operator =(const MyInt& temp){ a=temp.a; b=temp.b; cout<<"复制构造函数"<<endl; return *this; } /** * 重载+运算符(-,*,/,%与其相同) * 这里应该是值返回,因为值返回会产生临时变量,临时变量与局部变量result的复制 会进入到拷贝构造函数中,重新拷贝一份,局部变量result在运行完拷贝构造函数后才 会被释放掉; 若返回引用,则不会产生临时变量,函数结束后不会进入到拷贝构造函数,而函数运 行结束后,result变量已经被释放,即返回值所引用的对象已经被释放,就会指向一个 无效的值,即结果错误。 @param temp 进行加运算的第二个操作符 @return 运算的结果 */ MyInt operator +(const MyInt& temp) const { cout<<"+运算符的重载"<<endl; MyInt result; result.a=a+temp.a; result.b=b+temp.b; return result; } /** * 重载+=运算符(-=,*=,/=,%=与其相同) * 这里值返回和引用返回都可以得到正确的结果。而返回引用不用产生临时变量,所以 效率更高。注意的一点就是: 在函数中,若this本身会发生改变,则应该返回引用,因为this不会被销毁,即返回值所 指向的内存区域是正确的。 若this不会发生变化,需要创建一个局部变量result来保存结果值,因为局部变量最终会 在函数运行结束后释放掉,所以必须调用拷贝构造函数,完成值返回所产生的临时变量 与result的拷贝。 @param iSep 增加的值 @return 运算的结果 */ MyInt& operator +=(int iSep){ a+=iSep; b+=iSep; cout<<"+=运算符的重载"<<endl; return *this; } /** * 前递增(--同) * 直接增加,应该返回引用,理由同+= @return 已经改变的对象的引用 */ MyInt& operator ++(){ ++a; ++b; cout<<"前递增++运算符的重载"<<endl; return *this; } /** * 后递增(--同),用参数int来代表是后递增 * 先调用拷贝构造函数拷贝当前对象,作为最后的返回值。然后直接增加当前对象,应 该返回值,因为返回的是局部变量的拷贝。 @return 已经改变的对象的引用 */ MyInt operator ++(int){ cout<<"后递增++运算符的重载"<<endl; MyInt org(*this); ++a; ++b; return org; } bool operator ==(const MyInt& myInt){ cout<<"==运算符的重载"<<endl; return (a==myInt.a) && (b==myInt.b); } bool operator !=(const MyInt& myInt){ cout<<"!=运算符的重载"<<endl; return !(*this==myInt); } bool operator <(const MyInt& myInt){ cout<<"<运算符的重载"<<endl; return (a<myInt.a) && (b<myInt.b); } bool operator >(const MyInt& myInt){ cout<<">运算符的重载"<<endl; return !(*this<myInt); } bool operator <=(const MyInt& myInt){ cout<<"<=运算符的重载"<<endl; return (*this<myInt) && (*this==myInt); } bool operator >=(const MyInt& myInt){ cout<<">=运算符的重载"<<endl; return !(*this<myInt) && (*this==myInt); } friend ostream& operator <<(ostream& o, const MyInt& myInt){ cout<<myInt.a<<" "<<myInt.b<<endl; return o; } friend istream& operator >>(istream& i, MyInt& myInt){ cin>>myInt.a; cin>>myInt.b; return i; } }; int main() { MyInt int1(1,2); cout<<"int1="<<int1<<endl; MyInt int2(2,3); cout<<"int2="<<int2<<endl; MyInt int3; cout<<"int3="<<int3; cout<<endl<<"int3=int1+int2"<<endl; int3=int1+int2; cout<<"int3="<<int3; cout<<endl<<"int3+=3"<<endl; int3+=3; cout<<"int3="<<int3; cout<<endl<<"int3++"<<endl; cout<<"正在运算的int3="<<int3++; cout<<"运算后的int3="<<int3; cout<<endl<<"++int3"<<endl; cout<<"正在运算的int3="<<++int3; cout<<"运算后的int3="<<int3; cout<<endl<<"cout<<int3"<<endl; cout<<int3<<endl; (int1==int3) ? cout<<"int1==int3 true/n/n" : cout<<"int1==int3 false/n/n"; (int1!=int3) ? cout<<"int1!=int3 true/n/n" : cout<<"int1!=int3 false/n/n"; (int1<int3) ? cout<<"int1<int3 true/n/n" : cout<<"int1<int3 false/n/n"; (int1>int3) ? cout<<"int1>int3 true/n/n" : cout<<"int1>int3 false/n/n"; (int1<=int3) ? cout<<"int1<=int3 true/n/n" : cout<<"int1<=int3 false/n/n"; (int1>=int3) ? cout<<"int1>=int3 true/n/n" : cout<<"int1>=int3 false/n/n"; return 1; }

 

你可能感兴趣的:(C++重载运算符)