概念
运算符重载将重载的概念扩展到运算符上,允许赋予cpp运算符多种含义。实际上,很多cpp运算符已经被重载。例如,将*
运算符用于地址,将得到存储在这个地址中的值;但将它用于两个数字时,得到的将是它们的乘积。cpp根据操作数的数目和类型来决定采用哪种操作。
要重载运算符,需使用被称为运算符函数的特殊函数形式。运算符函数的形式:
重载+运算符:operator+()
重载*运算符:operator*()
重载 + 运算符案例
现在需要将类Time的两个对象中的私有变量值分别相加,赋值给另一个对象。
class Time
{
private:
int hours;
int minutes;
public:
Time();
Time(int h, int m=0);
// 不采用+运算符重载
Time Sum(const Time & t) const;
// +运算符重载
Time operator+(const Time & t) const;
}
// 不采用运算符重载
Time Time::Sum(const Time & t) const
{
...
}
// 采用运算符重载
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 planning;
Time coding(2, 40);
Time fixing(5, 55);
Time total;
// 不采用运算符重载时
total = coding.Sum(fixing);
// 采用运算符重载时
// 1. 可以像调用Sum()那样来调用operator+()方法
total = morefixing.operator+(total);
// 2. 也可以使用运算符表示法
total = coding + fixing;
重载 << 运算符案例
通过重载<<
运算符,可以自定义输出对象,如:
Time planning;
cout << planning;
要使Time类知道使用cout,必须使用友元函数。因为下面这样的语句使用了两个对象,其中一个是ostream
类对象(cout):
cout << planning;
如果使用一个Time成员函数来重载<<,Time对象将是第一个操作数,这意味着必须这样使用<<:
planning << cout ;
这样的方式会令人感到迷惑,但通过使用友元函数,可以像下面这样重载运算符:
void operator<<(ostream & os, const Time & t)
{
os << t.hours << " hours, " << t.minutes << " minutes";
}
可以这样使用下面的语句输出对象相关信息:
cout << planning;
进一步改进 << 重载
上述重新定义的<<重载不能与cout一起使用:
cout << "time is: " << planning << " (Tuerday\n)"; // can't do
为了实现上面的效果,需要将operator<<()函数实现为返回一个指向ostream对象的引用:
ostream & operator<<(ostream & os, const Time & t)
{
os << t.hours << " hours, " << t.minutes << " minutes";
return os;
}
总结
对于很多运算符来说,可以选择使用成员函数或非成员函数来实现运算符重载。一般来说,非成员函数应是友元函数,这样它才能直接访问类的私有数据。
评论区