第十二章 运算符重载
1. C++中可以称运算符为运算符函数。
2. 运算符函数可以作为某个类的成员函数,也可以作为普通的C++函数。(常作为类的友元函数)
3. 重载运算符时,至少要有一个操作数是用户自定义的类类型(如果都是基本数据类型还有基本数据类型的指针的话,定义已经存在)
4. 重载的运算符函数不能是类的静态成员函数。
5. 重载运算符时需要遵循的规则:
(1) 尽可能用引用型的参数,尽可能加const限制(避免拷贝构造函数,保护实参操作数,同时使运算符具有与常量运算的功能)
(2) 尽可能采用引用返回(避免构造临时对象,使运算表达式成为左值)
(3) 如果第一个操作数可能不是本类的对象的时候,必须重载为友元函数。
例子:希望日期类对象Date d(2008,8,8);与整数int n=6;进行相加运算。运算表达式d+n与n+d执行的使不同的运算符函数。前者可以作为类的成员函数,d作为第一个操作数。而后者只能作为友元函数来定义,将整数n作为第一个操作数。
6. 重载算术运算符(加减乘除)
不修改操作数,一般将运算结果存放在其他对象或者变量里然后值返回。
例如:
Date operator+(const Date &d, int n) //友元函数
{
Date temp(d);
int m=temp.DaysOfYear()+n;
temp.setDate(d.year,m);
return temp;
}
int Date::operator-(const Date &d) const //常量成员函数
{
return GetTotalDays()-GetTotalDays(d.year,d.month,d.day);
}
7. 重载迭代赋值运算符(+=, -=, *=, /=)
不修改右操作数,将计算得到的结果存入左操作数当中(这些运算符函数可以是友元函数也可以是成员函数),并应该设计成引用返回对象本身(return *this)
Date & Date::operator+=(int n)
{
*this=*this+n;
return *this;
}
8. 重载关系运算符(大于小于等于 大于等于 小于等于 不等于)
一般是布尔函数:bool Date::operator>(const) {return *this-d>0;}
---------------------------------课间休息分割---------------------------------------
9. 重载输入输出运算符
(1) 重载输出运算符<<
这个运算符是一个双目运算符,第一个操作数常常是cout,cout是ostream类的一个对象,所以第一个形式参数是osream &out并且返回out,使可以连续输出
(2) 重载输入运算符>>
这个运算符的第一个操作数常常是cin,并且可以连续输入
代码例子:
ostream &operator<<(ostream &out, const Data &d)
{
out<<setfill('0')<<setw(4)<<d.year
<<'/'<<setw(2)<<d.month
<<'/'<<setw(2)<<d.day<<setfill(' ');
return out;
}
istream &operator>>(istream &in,Data &d)
{
int year,month,day;
char str[100];
in.getline(str,100,'/');
if(in==NULL) return in;
year=atoi(str);
in.getline(str,100,'/');
if(in==NULL) return in;
month=atoi(str);
in.getline(str,100,'\n');
if(in==NULL) return in;
day=atoi(str);
d.setDate(year,month,day);
return in;
}
注意返回in和out是实现连续的输入和输出的关键。
重载单目运算符(前后自增):
10. 重载前增(减)量运算符
先修改操作数的值然后以新的值参与运算。注意经常需要在前增或者前减运算符里面做的一件事就是需要判断一下数据有没有超过某一个值。(比如说时间里面的++minute,要是++之后的minute大于等于60,就需要往前hour进位,然后minute设置为原来的减去60)
11. 重载后增(减)量运算符
为了区别后增(减)量运算符,C++中在函数首部添加一个纯形式的参数int(这个参数只起到记号的作用),告诉编译器这是后增量、后减量的意思
后增和后减的特点是先以原来的值参与表达式的其他运算一次,然后修改操作数的值。
代码:
Date Date::operator++(int n) //对象值返回,不宜做左值(?为啥)
{
Date temp(*this);
++(*this);
Return temp;
}
由于temp是一个局部自动变量,生命期随着函数返回而结束,所以上面两个后增运算符函数不能够采用引用返回