类的使用
运算符重载
运算符重载属于C++的一种多态形式,这种多态表现在编译期。而另外一种多态是虚函数,表现在运行期,原因是编译器只能在运行时候才能确定程序到底调用的是父类还是子类的虚函数。
运算符函数格式
operatorop(argument-list)
运算符重载实例
//mytime0.h
#ifndef MYTIMEO_H_
#define MYTIMEO_H_
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 Sum(const Time&t)const;//Time operator+(const Time&t)const;重载+运算符
void Show()const;
};
#endif
//mytime0.cpp
#include<iostream>
#include"mytime0.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::Sum(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 sum;
sum.minutes=minutes+t.minutes;
sum.hours=hours+t.hours+sum.minutes/60;
sum.minutes%=60;
return sum;
}*/
void Time::Show()const
{
std::cout<<hours<<"hours,"<<minutes<<" minutes";
}
注:operator double()const;//类型转换方法声明,可用来类与double类型之间的转换,返回double类型数据,但是函数原型不用声明返回类型。
友元
类外部访问私有成员的唯一方法就是友元。
创建友元
friend Time operator*(double m,const Time&t);//声明友元
定义注意两点:1.不要使用Time::限定符。2.不要使用关键字friend。
重载<<运算符
void operator<<(ostream&os,const Time&t)//定义
{
os<<t.hours<<"hours,"<<t.minutes<<"minutes";
}
cout<<trip;//4 hours ,23 minutes
但是这种重载方法有个问题,比如cout<<“trip:”<<trip;//error 因为在上述实现中并没有返回一个os对象,因此要改成以下形式:
ostream & operator<<(ostream& os,const Time& t)
{
os<<t.hours<<"hours,"<<t.minutes<<"minutes";
return os;
}
有趣的是,这个operator<<()版本还可以用于将输出写入到文件中:
#include<fstream>
....
ofstream fout;
fout.open("savetime.txt");
Time trip(12,40);
fout<<trip;//等同于operator<<(fout,trip);