5.4 C++重载输入与输出操作符
参考:http://www.weixueyuan.net/view/6382.html
总结:
在C++中,系统已经对左移操作符“<<”和右移操作符“>>”分别进行了重载,使其能够用作输入输出操作符,但是输入输出的处理对象只是系统内建的数据类型。
系统重载这两个操作符是以系统类成员函数的形式进行的,cout.operator<<( var )
如果我们自己定义了一种新的数据类型,需要用输入输出操作符去处理,则需要重载这两个操作符。
在重载输入操作符时,我们采用的是引用的方式进行传递参数的,输入的参数里面包含一个istream流的引用,返回值仍然为该引用,因此我们仍然可以使用输入操作符的链式输入。同样,输出也一样。
本例中,我们均采用顶层函数的形式进行操作符重载,同时为了能够方便访问类中的私有成员变量,我们将这些操作符重载函数声明为complex类的友元函数.
用操作符重载进行输入输出方便多了。 ---------------------------------
在C++中,系统已经对左移操作符“<<”和右移操作符“>>”分别进行了重载,使其能够用作输入输出操作符,但是输入输出的处理对象只是系统内建的数据类型。系统重载这两个操作符是以系统类成员函数的形式进行的,因此cout<< var语句可以理解为:
cout.operator<<( var )
如果我们自己定义了一种新的数据类型,需要用输入输出操作符去处理,则需要重载这两个操作符。在前面我们已经定义了complex类,如果我们需要直接输入输出复数的话我们可以对这两个操作符进行重载。下面将以complex为例说明重载输入输出操作符的方法。
我们可以重载输入操作符,使之读入两个double类型数据,并且将之转换为一个复数,并存入到一个复数类对象中。我们采用顶层函数的形式来实现输入操作符的重载。
istream & operator>>(istream & in, complex & A)
{
in >> A.real >> A.imag;
return in;
}
在上面函数中istream是指输入流,这个将会在后面讲到。因为重载操作符函数需要用到complex类的私有成员变量,为了方便,我们将这个函数声明为complex类的友元函数。其声明形式如下:
friend istream & operator>>(istream & in , complex & a);
该函数可以按照如下方式使用:
complex c;
cin>> c;
有了这两个语句后,我们输入(↙表示用户按下enter键)
1.45 2.34↙
之后这两个数据就分别成立复数类对象c的实部和虚部了。“cin>> c;”这一语句其实可以理解为:
operator<<(cin , c);
在重载输入操作符时,我们采用的是引用的方式进行传递参数的,输入的参数里面包含一个istream流的引用,返回值仍然为该引用,因此我们仍然可以使用输入操作符的链式输入。
complex c1, c2;
cin>> c1 >> c2;
同样的,我们也可以将输出操作符进行重载,使之能够输出复数。函数在类内部的声明如下:
Friend ostream & operator<<(ostream & out, complex & A);
顶层函数的实现如下:
ostream & operator<<(ostream & out, complex & A)
{
out << A.real <<" + "<< A.imag <<" i ";
return out;
}
与istream一样,ostream用于表示输出流,同样为了能够直接访问complex类的私有成员变量,我们将其在类内部声明为complex类的友元函数,同样该输出操作符重载函数可以实现链式输出。结合输入输出操作符的重载,我们将complex类的完整实现重新以示例的形式列出如下。
例1:
#include <iostream>
using namespace std; class complex
{
public:
complex();
complex(double a);
complex(double a, double 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 complex operator/(const complex & A, const complex & B);
friend istream & operator>>(istream & in, complex & A);
friend ostream & operator<<(ostream & out, complex & A);
void display()const;
private:
double real; //复数的实部
double imag; //复数的虚部
}; complex::complex()
{
real = 0.0;
imag = 0.0;
} complex::complex(double a)
{
real = a;
imag = 0.0;
} complex::complex(double a, double b)
{
real = a;
imag = b;
} //打印复数
void complex::display()const
{
cout<<real<<" + "<<imag<<" i ";
} //重载加法操作符
complex operator+(const complex & A, const complex &B)
{
complex C;
C.real = A.real + B.real;
C.imag = A.imag + B.imag;
return C;
} //重载减法操作符
complex operator-(const complex & A, const complex &B)
{
complex C;
C.real = A.real - B.real;
C.imag = A.imag - B.imag;
return C;
} //重载乘法操作符
complex operator*(const complex & A, const complex &B)
{
complex C;
C.real = A.real * B.real - A.imag * B.imag;
C.imag = A.imag * B.real + A.real * B.imag;
return C;
} //重载除法操作符
complex operator/(const complex & A, const complex & B)
{
complex C;
double square = A.real * A.real + A.imag * A.imag;
C.real = (A.real * B.real + A.imag * B.imag)/square;
C.imag = (A.imag * B.real - A.real * B.imag)/square;
return C;
} //重载输入操作符
istream & operator>>(istream & in, complex & A)
{
in >> A.real >> A.imag;
return in;
} //重载输出操作符
ostream & operator<<(ostream & out, complex & A)
{
out << A.real <<" + "<< A.imag <<" i ";;
return out;
} int main()
{
complex c1(4.3, -5.8);
complex c2(8.4, 6.7);
complex c3; 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 ;
}
在本例中,我们均采用顶层函数的形式进行操作符重载,同时为了能够方便访问类中的私有成员变量,我们将这些操作符重载函数声明为complex类的友元函数。我们直接来看主函数。在主函数的一开始我们定义了三个complex类的对象,并且c1和c2都用构造函数对复数进行赋值了。在这一步我们其实也可以用
cin>> c1 >> c2;
来替代,因为我们已经重载了输入操作符。在之前输出复数都必须通过类中的display函数,但是重载了输出操作符之后,就不需要这么麻烦了,直接输出就可以了,写法上简单不少。
5.4 C++重载输入与输出操作符的更多相关文章
- C++学习基础八——重载输入和输出操作符
一.重载输入操作符的要点: 1.返回值为istream &. 2.第一个参数为istream &in. 3.第二个参数为自定义类型的引用对象(例如Sales_Item &ite ...
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
今天在做C++ Primer习题的14.11时,印象中应该挺简单的一题,结果却费了很长时间. 类定义: typedef string Date; class CheckoutRecord{ publi ...
- C++ Primer笔记10_运算符重载_赋值运算符_进入/输出操作符
1.颂值运营商 首先来福值运算符引入后面要说的运算符重载.上一节说了构造函数.拷贝构造函数:一个类要想进行更好的控制.须要定义自己的构造函数.拷贝构造函数.析构函数.当然,还有赋值运算符.常说的三大函 ...
- C++运算符重载——输入/输出运算符
为了与IO标准库一致,重载输入输出运算符函数的第一个行参应该是流的引用,第二个行参是对象的引用. 如果重载为类的成员函数,第一个行参应该是对象的引用,第二个行参是流的引用. 使用方式是 ClassOb ...
- C++ 输入、输出运算符重载
C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型.我们可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型. 在这里,有一点很 ...
- 【c++】c++中重载输出操作符,为什么要返回引用
针对:ostream & operator <<(ostream & os, const ClassType &object) 说明几点: 1.第一个形参为对ost ...
- C++重载>>和<<(输入和输出运算符)详解
转载:http://c.biancheng.net/view/2311.html 在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据 ...
- C++输入与输出
1 概述 C和C++都没有将输入和输出建立在语言中,C++将输入输出的解决方案放在类库中(由头文件iostream和fstream中定义的类) C++程序把输入和输出看作字节流.流充当了程序和流源流目 ...
- C++基础学习3:输入和输出(cin和cout)
在C语言中,通常会在采用格式化输入输出函数printf和scanf用于输入或输出数据或信息.在C++语言中,C语言的这一套输入输出库我们仍能使用,但是C++语言又自定义了一套新的.更容易使用的输入输出 ...
随机推荐
- FreeRTOS
一.内核配置 1.configUSE_PREEMPTION 设置为1,使用抢先式内核:设置为0,为合作轮转内核. 2.configCPU_CLOCK_HZ 内部处理器执行的频率.这个值需要正确配置外围 ...
- redis在php运行时出现错误
我的redis版本:3.2.8. redis安装教程,参考官方网站: https://redis.io/download 在网上多番查找,很多说是配置文件redis.conf中的: # bind 12 ...
- rabbimq
问题 启动RabbitMQ后,没法访问Web管理页面 解决 RabbitMQ安装后默认是不启动管理模块的,所以需要配置将管理模块启动 启动管理模块命令如下 rabbitmqctl start_ ...
- 20170822xlVBA ExportCellPhone
Public Sub GetCellPhone() Dim CellPhone As String Dim Arr As Variant Dim Brr As Variant Dim n As Lon ...
- p1459 Sorting a Three-Valued Sequence
如果将1和3都放到正确的位置,2自然也在正确的位置.那么统计1,2,3的数量num1,num2,num3.再看前num1个数有几个(设x个)不是1,那么x个1肯定要移.设前num1个数有y个3,最后n ...
- p1209 Barn Repair
用优先队列存放不连续的断点及断的位置.优先取间距大的,在断点断开. #include <iostream> #include <cstdio> #include <cma ...
- android------基础面试题
1. Android的四大组件是哪些,它们的作用? 答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持 ...
- yii框架中获取添加数据后的id值
Yii::$app->db->createCommand()->insert('month4_user',['openid'=>$openid,'integ'=>0])- ...
- 在线linux 平台
1.http://www.shiyanlou.com/[实验楼] 2.http://bellard.org/jslinux/[大牛平台]
- 迷宫最短路径问题的dfs,bfs实现
迷宫的最短路径 给定一个大小为 N×M的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的小步数.请注意,本题假定从起点一定可以移动到终点 限制条件:N,M ...