1.添加加法运算符
operator+()函数的名称使得可以使用函数表示法或运算符表示法来调用它。
total=coding.operator+(fixing);//函数表示法
total=coding+fixing;//运算符表示法
多数C++运算符都可以用这样的方式重载。重载的运算符不必是成员函数,但必须至少有一个操作数是用户定义的类型。
重载运算符的限制:(1)重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符。因此,不能将减法运算符(-)重载为计算两个double值的和,而不是它们的差。(2)使用运算符时不能违反运算符原来的句法规则。不能修改运算符的优先级(3)不能创建新运算符(4)不能重载部分运算符(见书387面)。
2.友元
C++控制对类对象私有部分的访问。通常,公有类方法提供唯一的访问途径,但有时候这种限制太严格,以至于不适合特定的编程问题。在这种情况下,C++提供了另外一种形式的访问权限:友元——友元函数、友元类和友元成员函数。
通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。在为类重载二元运算符时(带两个参数的运算符)常常需要友元。
A=B*2.75;//可以被装换成下面的成员函数调用:
A=B.operator*(2.75);
A=2.75*B;//这个语句又将如何转换?
A=operator*(2.75,B)//A=2.75*B;可以与此非成员函数调用匹配
对于非成员函数重载运算符函数来说,运算符表达式左边的操作数对应于运算符函数的第一个参数,运算符表达式右边的操作数对应于运算符函数的第二个参数。非成员函数不能直接访问类的私有数据,至少常规非成员函数不能访问。然而,有一种特殊的非成员函数可以访问类的私有成员——友元函数。
创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend:
friend Time operator*(double m,const Time &t);
虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;虽然operator*()函数不是成员函数,但是它与成员函数的访问权限相同。
第二步是编写函数定义。因为它不是成员函数,所以不要使用Time::限定符。另外不要在定义中使用关键字friend。
常用的友元:重载<<运算符
void operator<<(ostream & os,const Time &t)
{
os<<t.hours<<"hours,"<<t.minutes<<"minutes";
}
//这样就可以使用,trip是Time的一个对象
//cout<<trip
//mytime.h
#ifndef MYTIME3_H_
#define MYTIME3_H_
#include<iostream>
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h,int m=0);
void AddMin(int m);
void AddHr(int h);
void Reset(int h=0,int m=0);
Time operator+(const Time &t)const;
Time operator-(const Time &t) const;
Time operator*(double n) const;
friend Time operator*(double m,const Time &t)
{return t*m;}
friend std::ostream & operator<<(std::ostream &os,const Time &t);
};
#endif
//mytime.cpp
#include "mytime.h"
Time::Time()
{
hours=minutes=0;
}
Time::Time(int h,int m)
{
hours=h;
minutes=m;
}
void Time::AddMin(int m)
{
minutes+=m;
hours+=minutes/60;
minutes%=60;
}
void Time::AddHr(int h)
{
hours+=h;
}
void Time::Reset(int h,int m)
{
hours=h;
minutes=m;
}
Time Time::operator+(const Time & t)const
{
Time sum;
sum.minutes=minutes+t.minutes;
sum.hours=hours+t.hours+sum.minutes/60;
sum.minutes%=60;
return sum;
}
Time Time::operator-(const Time &t)const
{
Time diff;
int tot1,tot2;
tot1=t.minutes+60*t.hours;
tot2=minutes+60*hours;
diff.minutes=(tot2-tot1)%60;
diff.hours=(tot2-tot1)/60;
return diff;
}
Time Time::operator*(double mult)const
{
Time result;
long totalminutes=hours*mult*60+minutes*mult;
result.hours=totalminutes/60;
result.minutes=totalminutes%60;
return result;
}
std::ostream & operator<<(std::ostream &os,const Time &t)
{
os<<t.hours<<"hours,"<<t.minutes<<"minutes";
return os;
}
//usingtime.cpp
#include<iostream>
#include"mytime.h"
int main()
{
using std::cout;
using std::endl;
Time aida(3,35);
Time tosca(2,48);
Time temp;
cout<<"Aida and Tosca:\n";
cout<<aida<<":"<<tosca<<endl;
temp=aida+tosca;
cout<<"Aida+Tosca:"<<temp<<endl;
temp=aida*1.17;
cout<<"Aida*1.17:"<<temp<<endl;
cout<<"10.0*Tosca:"<<10.0*tosca<<endl;
return 0;
}