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++语言又自定义了一套新的.更容易使用的输入输出 ...
随机推荐
- 数据结构(C语言版)-第3章 栈和队列
3.1 栈和队列的定义和特点3.2 案例引入3.3 栈的表示和操作的实现3.4 栈与递归3.5 队列的的表示和操作的实现3.6 案例分析与实现 基本操作有入栈.出栈.读栈顶元素值.建栈.判断栈满.栈空 ...
- Getting started with Processing 示例11-9 追随鼠标移动
程序片段 int num = 60; int[] x = new int[num]; int[] y = new int[num]; void setup(){ size(240,120); noSt ...
- spring boot+freemarker+spring security标签权限判断
spring boot+freemarker+spring security标签权限判断 SpringBoot+SpringSecurity+Freemarker项目中在页面上使用security标签 ...
- 20170922xlVBA_GetCellTextFromWordDocument
Sub GetCellTextFromWordDocument() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAler ...
- gdb 不同位置,函数调用参数显示差异
gdb 不同位置,函数调用参数显示差异,如: copy_strings (argc=1, argv=0xffcf08, page=0xffce6c, p=131068, from_kmem=2) at ...
- php实现队列
<?php //双向队列的实现 class DoubleEndedQueue{ public $elements; public function __construct(){//析构函数,创建 ...
- git部署
1. 自动部署原理 先讲实现方法和原理.Git服务和仓库都是在服务器上的,服务器上的Web目录和本地都有完整的代码.Git有个叫hook的机制,可以在代码更新时执行回调(执行一段shell).一般执行 ...
- python基础之小数据池,is和==区别 编码问题
主要内容 小数据池,is和==区别 编码问题 小数据池 一种缓存机制,也称为驻留机制,是为了能更快提高一些字符串和整数的处理速度is 和 == 的区别 == 主要指对变量值是否相等的判断,只要数值相同 ...
- yield生成器
def say_hi(): while True: print("before") ret0 = "返回值" msg = yield ret0 #yield后的 ...
- Oracle中序列(Sequence)详解
一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用途是生成表的主键值,可以在插入语句中引用,也 ...