《Cracking the Coding Interview程序员面试金典》----C++重载>>和<<(输入输出运算符)
来源:互联网 发布:手机密码下载软件 编辑:程序博客网 时间:2024/06/06 18:36
在C++中,标准库本身已经对左移运算符
如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面的 complex 类为例来演示输入输出运算符的重载。
istream 表示输入流,cin 是 istream 类的对象,只不过这个对象是在标准库中定义的。之所以返回 istream 类对象的引用,是为了能够连续读取复数,让代码书写更加漂亮,例如:ostream 表示输出流,cout 是 ostream 类的对象。由于采用了引用的方式进行参数传递,并且也返回了对象的引用,所以重载后的运算符可以实现连续输出。
为了能够直接访问 complex 类的 private 成员变量,同样需要将该函数声明为 complex 类的友元函数:
运行结果:
2.4 3.6↙
4.8 1.7↙
c1 + c2 = 7.2 + 5.3 i
c1 - c2 = -2.4 + 1.9 i
c1 * c2 = 5.4 + 21.36 i
c1 / c2 = 0.942308 + 0.705128 i
<<
和右移运算符>>
分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面的 complex 类为例来演示输入输出运算符的重载。
其实 C++ 标准库已经提供了 complex 类,能够很好地支持复数运算,但是这里我们又自己定义了一个 complex 类,这样做仅仅是为了教学演示。本节要达到的目标是让复数的输入输出和 int、float 等基本类型一样简单。假设 num1、num2 是复数,那么输出形式就是:
cout<<num1<<num2<<endl;
输入形式就是:cin>>num1>>num2;
cout 是 istream 类的对象,cin 是 ostream 类的对象,要想达到这个目标,就必须以全局函数(友元函数)的形式重载<<
和>>
,否则就要修改标准库中的类,这显然不是我们所期望的。重载输入运算符>>
下面我们以全局函数的形式重载>>
,使它能够读入两个 double 类型的数据,并分别赋值给复数的实部和虚部:
- istream & operator>>(istream &in, complex &A){
- in >> A.m_real >> A.m_imag;
- return in;
- }
complex c1, c2;
cin>>c1>>c2;
complex c1, c2;
cin>>c1;
cin>>c2;
friend istream & operator>>(istream & in , complex &a);
>>
运算符可以按照下面的方式使用:complex c;
cin>>c;
1.45 2.34↙
后,这两个小数就分别成为对象 c 的实部和虚部了。cin>> c;
这一语句其实可以理解为:operator<<(cin , c);
重载输出运算符<<
同样地,我们也可以模仿上面的形式对输出运算符>>
进行重载,让它能够输出复数,请看下面的代码:
- ostream & operator<<(ostream &out, complex &A){
- out << A.m_real <<" + "<< A.m_imag <<" i ";
- return out;
- }
为了能够直接访问 complex 类的 private 成员变量,同样需要将该函数声明为 complex 类的友元函数:
friend ostream & operator<<(ostream &out, complex &A);
综合演示
结合输入输出运算符的重载,重新实现 complex 类:
- #include <iostream>
- using namespace std;
- class complex{
- public:
- complex(double real = 0.0, double imag = 0.0): m_real(real), m_imag(imag){ };
- public:
- friend complex operator+(const complex & A, const complex & B);
- friend complex operator-(const complex & A, const complex & B);
- friend complex operator*(const complex & A, const complex & B);
- friend complex operator/(const complex & A, const complex & B);
- friend istream & operator>>(istream & in, complex & A);
- friend ostream & operator<<(ostream & out, complex & A);
- private:
- double m_real; //实部
- double m_imag; //虚部
- };
- //重载加法运算符
- complex operator+(const complex & A, const complex &B){
- complex C;
- C.m_real = A.m_real + B.m_real;
- C.m_imag = A.m_imag + B.m_imag;
- return C;
- }
- //重载减法运算符
- complex operator-(const complex & A, const complex &B){
- complex C;
- C.m_real = A.m_real - B.m_real;
- C.m_imag = A.m_imag - B.m_imag;
- return C;
- }
- //重载乘法运算符
- complex operator*(const complex & A, const complex &B){
- complex C;
- C.m_real = A.m_real * B.m_real - A.m_imag * B.m_imag;
- C.m_imag = A.m_imag * B.m_real + A.m_real * B.m_imag;
- return C;
- }
- //重载除法运算符
- complex operator/(const complex & A, const complex & B){
- complex C;
- double square = A.m_real * A.m_real + A.m_imag * A.m_imag;
- C.m_real = (A.m_real * B.m_real + A.m_imag * B.m_imag)/square;
- C.m_imag = (A.m_imag * B.m_real - A.m_real * B.m_imag)/square;
- return C;
- }
- //重载输入运算符
- istream & operator>>(istream & in, complex & A){
- in >> A.m_real >> A.m_imag;
- return in;
- }
- //重载输出运算符
- ostream & operator<<(ostream & out, complex & A){
- out << A.m_real <<" + "<< A.m_imag <<" i ";;
- return out;
- }
- int main(){
- complex c1, c2, c3;
- cin>>c1>>c2;
- c3 = c1 + c2;
- cout<<"c1 + c2 = "<<c3<<endl;
- c3 = c1 - c2;
- cout<<"c1 - c2 = "<<c3<<endl;
- c3 = c1 * c2;
- cout<<"c1 * c2 = "<<c3<<endl;
- c3 = c1 / c2;
- cout<<"c1 / c2 = "<<c3<<endl;
- return 0;
- }
2.4 3.6↙
4.8 1.7↙
c1 + c2 = 7.2 + 5.3 i
c1 - c2 = -2.4 + 1.9 i
c1 * c2 = 5.4 + 21.36 i
c1 / c2 = 0.942308 + 0.705128 i
0 0
- 《Cracking the Coding Interview程序员面试金典》----C++重载>>和<<(输入输出运算符)
- cracking the coding interview 中文版 (程序员面试金典)
- cracking the coding interview 中文版 (程序员面试金典)
- cracking the coding interview 中文版 (程序员面试金典)
- 《Cracking the Coding Interview程序员面试金典》----另类加法(不得使用+-x/运算符号)
- 《Cracking the Coding Interview程序员面试金典》----空格替换
- 《Cracking the Coding Interview程序员面试金典》----像素翻转
- 《Cracking the Coding Interview程序员面试金典》----清除行列
- 《Cracking the Coding Interview程序员面试金典》----实时中位数
- 《Cracking the Coding Interview程序员面试金典》----词频统计
- 《Cracking the Coding Interview程序员面试金典》----数字发音
- 《Cracking the Coding Interview程序员面试金典》-----
- 《Cracking the Coding Interview程序员面试金典》----最大和子矩阵
- 《Cracking the Coding Interview程序员面试金典》----最大连续数列和
- 《Cracking the Coding Interview程序员面试金典》----最大字母矩阵(字母相同)
- 《Cracking the Coding Interview程序员面试金典》----最大子方块(寻找01)
- 《Cracking the Coding Interview程序员面试金典》----字符串变换(字典树)
- 《Cracking the Coding Interview程序员面试金典》----下一个元素(下一个比他大的)
- 如何使用阿里百川hotfix热修复功能(二)
- 文章标题 CSU 1843: Jumping monkey (状态压缩+dp)
- spring-mvc注解式格式化属性数据
- 如何构建大型网站架构
- php输出汉字乱码
- 《Cracking the Coding Interview程序员面试金典》----C++重载>>和<<(输入输出运算符)
- spring-boot 和 redis 集成的一个小例子
- Ubuntu: Chinese simplified
- [CoffeeBot] 配置最后脚本
- Django View类的解析
- enum枚举型字段查询等于1不出数据问题
- 深入分析Volatile的实现原理
- spark 2.1 on yarn deployment
- 访问WEB-INF目录中的JSP文件