侧边栏壁纸
博主头像
如此肤浅博主等级

但行好事,莫问前程!

  • 累计撰写 24 篇文章
  • 累计创建 12 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录
C++

C++ | 运算符重载

如此肤浅
2022-04-18 / 0 评论 / 0 点赞 / 484 阅读 / 1,689 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-10-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

概念

运算符重载将重载的概念扩展到运算符上,允许赋予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;
}

总结

对于很多运算符来说,可以选择使用成员函数或非成员函数来实现运算符重载。一般来说,非成员函数应是友元函数,这样它才能直接访问类的私有数据。

0

评论区