关于操作符“>>”和“<<”的重载
2013-07-15 22:16
465 查看
背景
关于操作符的重载,主要是为了实现类多态性。今天主要是对操作符">>"和"<<"进行概述。现阶段正在学习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; }
其输出结果如下
关于“>>” 和“ <<” 操作符的重载暂时记录到这里了,后续会将整个操作符的重载进行各总结,不过我们从这个最简单的例子中不难对总体进行推演,会发现其实原理都是相同的。
相关文章推荐
- 多关键字排序(里面有关于操作符(<<运算符 和 >>运算符 )的重载)
- C++输入操作符>> 输出操作符<<重载
- 关于C++操作符重载之"->"和"*"
- 重载输入>>,输出<<操作符
- 关于 操作符“<<”和“>>”重载的心得
- 关于HTML<!DOCTYPE>标签
- 关于Spring中的<context:annotation-config/>配置
- 关于#include<bits/stdc++.h>头文件的使用
- 关于java中<T>问题
- 关于Spring中的<context:annotation-config/>配置
- <iOS>关于子线程和block中操作主线程界面的控件讨论
- 关于‹和›转义成< 和>的问题
- 关于<taglib>的uri的一点总结
- EBS系统<关于Oracle数据库的包的编译(对AP程序的)影响>
- 关于cxf生成客户端代码中的JAXBElement<String>
- 关于&lsaquo;和&rsaquo;转义成< 和>的问题
- 关于Predicate<T>委托
- 关于jsp中使用 <jsp:userBean/> <jsp:setProperty/> <jsp:getProperty/>
- 重载一个+运算符、<<运算符和>运算符。实现对分数的运算
- 关于maven的配置文件pom.xml中<classifier>jdk15</classifier>在gradle中的表达问题