背景
关于操作符的重载,主要是为了实现类多态性。今天主要是对操作符">>"和"<<"进行概述。现阶段正在学习C++,通过此来对C++的巩固,当一些东西不能理解的时候,就死记硬背吧....
实现
这里将C++Primer中的另一个例子拿过来用,里面主要是一个书籍销售管理的一个类。主要定义如下:
class CSalesItem
{
public:
CSalesItem(void);
~CSalesItem(void);
CSalesItem& operator+(constCSalesItem& item);
std::istream&operator>>(std::istream& ism);
std::ostream& operator<<(std::ostream&osm);
friend std::istream&operator>>(std::istream& ism, CSalesItem& item);
friend std::ostream&operator<<(std::ostream& osm, CSalesItem& item);
private:
static const int ISBN_LEN = 30;
char m_sISBNString[ISBN_LEN]; // ISBN编号,官方说法是“国际通用的图书或独立的出版物(不含定期出版的连续出版物,如期刊)代码”
int m_iSalesNum; // 卖出的数量
float m_fPrice; //书的价格
float m_fTotalIncom; //总收入
};
这里暂时不涉及这个类的操作,主要是对输入输出操作符的重载进行讲解。
友元函数实现
函数定义
friend std::istream&operator>>(std::istream& ism, CSalesItem& item);
friend std::ostream&operator<<(std::ostream& osm, CSalesItem& item);
函数实现
std::istream& operator>>(std::istream& ism, CSalesItem& item)
{
return ism >> item.m_sISBNString >> item.m_fPrice >>item.m_iSalesNum;
}
std::ostream& operator<<(std::ostream& osm, CSalesItem& item)
{
return osm << "ISBN:" << item.m_sISBNString<< "\nPrice:"
<< item.m_fPrice << "\nSalesNumber:" << item.m_iSalesNum
<< "\nTotal Income:" <<item.m_fTotalIncom << std::endl;
}
PS:假设友元函数和引用,都了解了,实在不明白,去翻翻书一下子就明白了
在这里我们可以看到,在这两个运算符的重载函数当中,首先对于函数的形参和返回值都是采用的引用方式,由于是一个友元函数,那么我们肯定是要包含一个类类型变量CSalesItem& Item,这样子主要是为了对对象中的成员进行操作,也就是在我们这两个冲在操作符函数实现中的对类成员变量的一些操作,ism >> item.m_sISBNString >>item.m_fPrice >> item.m_iSalesNum; 从这个语句我们看到其实它所做的操作就是对一些标准库中定义好的类型的输入输出操作,也就是我们自己定义的重载函数实质上是一些节本操作的集合。
类成员函数实现
函数定义
std::istream&operator>>(std::istream& ism);
std::ostream&operator<<(std::ostream& osm);
对于类成员函数实现重载函数,最大的区别就是这些函数的形参列表中隐藏了一个this指针,这样子我们就可以直接的访问类成员对象了,而不是想上述通过友元函数,系需要传入一个类对象实例,才能对成员进行操作。
函数实现
std::istream&CSalesItem::operator>>(std::istream& ism)
{
return ism >> m_sISBNString>> m_fPrice >> m_iSalesNum;
}
std::ostream&CSalesItem::operator<<(std::ostream& osm)
{
return osm << "ISBN:"<< m_sISBNString << "\nPrice:"
<< m_fPrice <<"\nSales Number:" << m_iSalesNum
<< "\nTotalIncome:" << m_fTotalIncom << std::endl;
}
对于类成员函数实现重载函数,最大的区别就是这些函数的形参列表中隐藏了一个this指针,这样子我们就可以直接的访问类成员对象了,而不是想上述通过友元函数,系需要传入一个类对象实例,才能对成员进行操作。
测试
写了一个简单的测试例子
#include"SalesItem.h"
#include<Windows.h>
#include<iostream>
int main(void)
{
CSalesItem item;
std::cin >> item;
std::cout << item;
return 0;
}
其输出结果如下
关于“>>” 和“ <<” 操作符的重载暂时记录到这里了,后续会将整个操作符的重载进行各总结,不过我们从这个最简单的例子中不难对总体进行推演,会发现其实原理都是相同的。