内存操作符 new 和 delete 系统本身就提供了非常稳固的方法,很少会有情况用到自己重载的 new 和 delete,除非是想实现什么特别的功能,比如在申请内存后自动填入什么数据等等,当然这并不是本文讨论的重点,本文的重点是记录如何重载这两个操作符。
运算符重载使用它类对象作为参数
我们想实现一个功能,分别有两个类,一个名为 Sender,负责发送邮件。另外一个类名为 Mail,负责管理发送的标题和内容。在使用的时候,我们需要让类 Sender 重载 << 操作符,以实现将 Mail 类的数据发送出去,大致用法就是 Sender << Mail 这样的方式。这就涉及到了诸多问题。
运算符重载流输入输出<< >>
流输入输出运算符 >> << 比较简单,C++提供了固定的格式,语法上并不是非常难,你只需要记住 istream 和 ostream 这两个类就可以了。本文使用了友元函数方式来实现。具体实现的代码如下,请注意看返回 istream 和 ostream 引用的原因是为了可以使用连续的>>或<<操作符来输入输出。
运算符成员函数与友元函数重载
上一篇文章我们介绍了运算符重载的目的和一个简单的应用案例。但运算符重载绝非我们想想的那么简单和容易,有很多陷阱我们如果我们还没有去踩过,是不会了解清楚内部的工作原理的。本文只介绍一下运算符重载的两种方式,成员函数重载和友元函数重载,并不具体到某些运算符的具体案例。
友元类的实现
在将一个类中的成员函数作为另一个类的友元函数的案例中我们看到,为了一个其他类的函数可以访问本类中的私有成员,将 distance 函数声明成了 friend 函数。其实我们也完全可以将整个 ManagerPoint 类声明为 Point 类的友元类。代码如下:
类A的成员函数做类B的友元函数
这种方法相对麻烦,主要是在两个类之间的前后声明有着复杂的逻辑关系。但只要我们理清思路,是可以实现的。跟着我从最初的想法到实现一步一步的理顺逻辑,就非常容易理解如何操作了。
友元概念及简单使用方法
在C++中类的出现,将数据和方法都封装在类中,似有的数据成员只有类中的成员函数才能操作,但有些时需要定义某些函数,它不是类中的成员,但需要频繁的操作类中的私有数据成员。此时可以将这些函数定义为某个类的友元函数。除了友元函数外,还有友元类,两者都成为友元。友元的出现提高了程序的运行效率,但是破坏了类的封装性和隐蔽性,使非成员函数可以访问类的私有成员。