自增和自减运算符有前缀和后缀两种形式,都会改变对象,所以不能对常量对象操作。 前缀形式返回改变后的对象,返回*this。 后缀形式返回改变之前的值,所以必须创建一个代表这个值的独立对象并返回它,是通过传值方式返回的。 如何区分前缀和后缀形式呢? 后缀形式的自增和自减比前缀形式多一个int参数,这个参数在函数中并不使用,只是作为重载函数的标记来区分前缀和后缀运算。例如,对Byte类对象b,编译器看到++b,会调用Byte::opeartor++(), 而b++会调用Byte::operator++(int)。 如果要重载自增和自减运算符,一般应同时定义自增、自减运算符的前缀式和后缀式。重载运算符的行为应尽量与内置运算符保持一致。
赋值运算符operator= 只能用成员函数重载。
#include <iostream> using namespace std; class MinInt { char b; public: MinInt(char ch = 0) : b(ch) {}; MinInt operator-( )const{ //一元运算"-" cout<<"MinInt::operator-"<<endl; return MinInt(-b); } MinInt operator+(const MinInt& rv)const {//二元运算 + cout << "MinInt::operator+" << endl; return MinInt(b + rv.b); //返回值优化 } MinInt& operator+=(const MinInt& rv){//复合赋值运算 += 这里不能加const,const表示的是不变的 cout << "MinInt::operator+=" << endl; b += rv.b; return *this; } }; //end of class MinInt
_
#include <iostream> #include <cassert> using namespace std; class MinInt{ char m; public: MinInt(int val = 0){ //int类型转换为MinInt assert(val>=0 && val<=100); //要求取值范围在0~100之间 m = static_cast<char>(val); //这不是将int强制转换成char么 } operator int(){ //MinInt对象转换为int 类型 return static_cast<int>(m); } }; int main(){ MinInt mi(10), num; num = mi + 20; /*首先将mi转换为int类型,再执行加法运算; 再将int类型的计算结果30 转换为赋值左边的MinInt 类型 */ int val = num; //将num自动转换为int,并赋值给val cout<< mi << '\t' << num << '\t' << val; //num 和mi 转换为int输出 }
_