重载<<和>>
在C++编程中实现数据的输入/输出能够用cin>>ch/cout<<ch;
可是使用cin>>ch或cout<<ch并不能实现一些特殊的数据的输入或者输出,比方输入复数、输出复数、输入时间、输出时间
为了解决对于特殊数据的输入和输出在C++中能够使用运算符重载的方式实现。能够通过重载>>和<<运算符实现特殊数据的输入和输出
1重载>>
重载函数的形式:
<span style="color:#000000;">friend istream& operator >>(istream& input, Complex& c);</span>
第一个參数: istream表示输入流
第二个參数: Complex& 表示对Complex类实行输入
返回值: istream表示返回输入流
2重载<<
重载函数的形式:
friend ostream& operator <<(ostream& output, Complex& c);
第一个參数: ostream表示输入流
第二个參数:
Complex& 表示对Complex类实行输出
返回值:
ostream表示返回输出流
运用实例,通过重载>>和<<实现复数的输入和输出
#include <iostream> using namespace std; class Complex
{
public:
Complex( )//定义默认构造函数初始化复数
{
real=0;
imag=0;
} //使用初始化表初始化复数
Complex(double r, double i):real(r),imag(i){} Complex operator+(Complex &c2);//复数的加法
Complex operator-(Complex &c2);//复数的减法
Complex operator*(Complex &c2);//复数的乘法
Complex operator/(Complex &c2);//复数的除法 //重载<<运算符实现输出复数
friend ostream& operator <<(ostream& output, Complex& c); //重载>>运算符实现输入复数
friend istream& operator >>(istream& input, Complex& c); private:
double real;//复数的实部
double imag;//复数的虚部
}; //复数的加法
Complex Complex::operator+(Complex &c2)
{
Complex c3; c3.real = real + c2.real;
c3.imag = imag + c2.imag; return c3;
} //复数的减法
Complex Complex::operator-(Complex &c2)
{
Complex c3; c3.real = real - c2.real;
c3.imag = imag - c2.imag; return c3;
} //复数的乘法
Complex Complex::operator*(Complex &c2)
{
Complex c3; c3.real = real*c2.real - imag * c2.imag;
c3.imag = real*c2.imag + imag * c2.real; return c3;
} //复数的除法
Complex Complex::operator/(Complex &c2)
{
Complex c3; c3.real = (real * c2.real + imag * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag); c3.imag = (imag * c2.real - real * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag); return c3;
} //重载>>运算符实现输入复数
istream& operator >>(istream& input, Complex& c)
{
char op, ch;//保存字符 ,如1+2i, op保存+, ch保存i input>>c.real>>op>>c.imag>>ch; return input;
} //重载<<运算符实现输出复数
ostream& operator <<(ostream& output, Complex& c)
{
output<<c.real<<"+"<<c.imag<<"i"<<endl; return output;
} void main( )
{
//定义三个复数
Complex c1, c2, c3; cout<<"请输入一个复数:";
cin>>c1; cout<<"请输入一个复数:";
cin>>c2; //打印第一个复数
cout<<"c1 = ";
cout<<c1; //打印第二个复数
cout<<"c2 = ";
cout<<c2; //两个复数相加
c3 = c1 + c2;
cout<<"c1 + c2 = ";
cout<<c3; //两个复数想减
c3 = c1 - c2;
cout<<"c1 - c2 = ";
cout<<c3; //两个复数相乘
c3 = c1 * c2;
cout<<"c1 * c2 = ";
cout<<c3; //两个复数相除
c3 = c1 / c2;
cout<<"c1 / c2 = ";
cout<<c3; system("pause");
}
程序运行结果:
在程序中分别输入 5+10i 和 4+8i 后
重载<<和>>的更多相关文章
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
- PHP类和对象之重载
PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的.属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值.读取.判断属性是否设置.销毁属性. ...
- C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱
一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...
- new/delete重载
在c++中,有时我们需要在运行阶段为一个变量分配未命名的内存,并使用指针来访问它,这里就可以用到new关键字.另外需要指出的是,new分配的内存块通常与常规变量分配的内存块不同,常规变量的值都储存在被 ...
- java重载与覆写
很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...
- 【C++】多态性(函数重载与虚函数)
多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. ...
- C++ 运算符重载时,将运算符两边对象交换问题.
在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...
- C++重载new和delete运算符
内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...
- Java学习笔记之方法重载
被重载的方法必须具有不同的参数列表.不能基于不同修饰符或返回值类型来重载方法. package welcome; public class TestMethodOverloading { public ...
- Qt 5.0+ 中 connect 新语法与重载函数不兼容问题的解决方法,以及个人看法
Qt 5.0+ 版本提供了 connect 的新语法,相比之前的语法新语法可以提供编译期检查,使用也更方便.可是使用过程中发现一个小问题——当某个 signal 和成员函数是重载关系的时候,qmake ...
随机推荐
- ZOJ 3497 Mistwald
矩阵快速幂. 邻接矩阵的$P$次方就是走$P$步之后的方案数,这里只记录能否走到就可以了.然后再判断一下三种情况即可. #pragma comment(linker, "/STACK:102 ...
- 关于sql查询语句中的别名
sql语句中给子查询或其他查询类型加别名的时候可能会报错 java.sql.SQLException: 无法转换为内部表示 原因是select返回类型的实体类中没有写该别名 原来的实体类 更改后的实体 ...
- hibernate对象关系映射的配置
一对一主键关联单双向 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-m ...
- Luogu P2486 染色(树链剖分+线段树)
题解 不妨采取重链剖分的方式把路径剖成区间,然后用线段树维护,考虑如何合并一个区间 struct Node { int lf, rg, tot; }seg[N << 2]; int col ...
- 第8天-setInterval/setTimeout
setInterval是什么? setInterval()方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟. setInterval(函数,间隔时间) 例如 function f ...
- Python开发基础-Day18继承派生、组合、接口和抽象类
类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承obj ...
- angularjs学习笔记3-directive中scope的绑定修饰符
在angularjs中,一个directive返回一个对象,对象存在很多属性,并且可以在directive中自定义自己的scope,而使用自己的scope是为了防止一个directive被使用在多个地 ...
- 2. let和const命令--ES6
1. let命令 let 命令不存在变量提升let 命令 只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: a is ...
- [BZOJ5251][九省联考2018]劈配(网络流)
5251: [2018多省省队联测]劈配 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 33 Solved: 22[Submit][Status][ ...
- 【容斥原理】Codeforces Round #428 (Div. 2) D. Winter is here
给你一个序列,让你对于所有gcd不为1的子序列,计算它们的gcd*其元素个数之和. 设sum(i)为i的倍数的数的个数,可以通过容斥算出来. 具体看这个吧:http://blog.csdn.net/j ...