C++ 重载操作符- 02 重载输入输出操作符
重载输入输出操作符
本篇博客主要介绍两个操作符重载。一个是 <<
(输出操作符)、一个是 >>
(输入操作符)
现在就使用实例来学习:如何重载输入和输出操作符。
#include <iostream>
#include <string>
using namespace std;
int main(){
cout << "hello" << endl;
system("pause");
return 0;
}
现在在程序里面定义一个 Sales_item
类。(Sales_item :销售单,销售项目。卖书的)
class Sales_item{
public:
Sales_item(string &book, unsigned units, double price):
isbn(book), units_sold(units), revenue(price*units){}
Sales_item():units_sold(0), revenue(0.0){}
private:
string isbn;
unsigned units_sold;
double revenue;
};
在main()
函数中创建一个 Sales_item
类的对象,然后试着使用 <<
输出操作符输出它。
int main(){
Sales_item a;
cout << a;
system("pause");
return 0;
}
会提示程序有错误,编译都不能通过。这是为什么?因为我们并没有重载 Sales_item
类的输出操作符,所以 cout << a;
这一行现在是错误的。
同样的道理:cin >> a;
这句代码也是错误的。
Sales_item
类现在即没有重载输入操作符,也没有重载输出操作符。现在,我们给他添加输入操作符重载的代码 和 输出操作符重载的代码。
重载输出操作符
在 main()
函数中创建一个 Sales_item
类的对象:
int main(){
Sales_item item(string("0-201-78345-X"), 2, 25.00);
system("pause");
return 0;
}
我现在就像使用 cout << item << endl;
这段代码将 item
对象里面的内容输出。(现在在main()
函数中这样写是不行的,因为C++现在不知道如何输出这个对象。所以)我们需要编写输出操作符的重载代码。
重载输出操作符是比较简单的,把它做成一个友元函数,然后在输出的时候,直接将类的输出成员输出。
现在写一个函数。
输出操作符重载函数的返回结果 和 第一个形参 都必须是 ostream
类型,第二个形参就是 Sales_item
类型。
ostream& operator<<(ostream& out, const Sales_item& s){
out << s.isbn << "\t" << s.units_sold << "\t" << s.revenue ;
return out;
}
同时在 Sales_item
类里面的 public
里面,添加 对应的友元函数的声明:
class Sales_item{
public:
friend ostream& operator<<(ostream& out, const Sales_item& s);
现在我们在main()
函数中添加测试代码:
int main(){
Sales_item item(string("0-201-78345-X"), 2, 25.00);
cout << item << endl;
system("pause");
return 0;
}
运行输出:
0-201-78345-X 2 25
请按任意键继续. . .
成功
编写输入操作符重载
输入操作符也有一个 输入流,类型为:istream
。输出操作符重载函数中第2个形参是 const
修饰,但是输入操作符重载函数的第2个形参就是不能使用 const
关键字修饰了,因为我们在函数里面会对这个形参里的数据进行修改。
istream& operator>>(istream& in, Sales_item& s){
double price;
in >> s.isbn >> s.units_sold >> price;
s.revenue = s.units_sold * price;
return in;
}
而且这个函数也要做成 Sales_item
类的友元函数。在 Sales_item
类中的 public
类里面添加下面的代码:
class Sales_item{
public:
friend istream& operator>>(istream& in, Sales_item& s);
现在在 main()
函数中添加新的测试代码:
int main(){
Sales_item item(string("0-201-78345-X"), 2, 25.00);
cout << item << endl;
cin >> item;
cout << item << endl;
system("pause");
return 0;
}
运行代码:
0-201-78345-X 2 50
0-201-123
4
10
0-201-123 4 40
请按任意键继续. . .
对于输入操作符重载的函数的编写还没有完,我们一般要在代码中添加:处理输入操作的错误处理代码。(输出操作一般不会出错的,但是输入操作一般经常很容易出错。)比如说:数据的格式不对这样的错误。
我们可以使用 if
来检查输入流的状态,else
里面的就是出错了,我们就将 s
重新构造成一个空的对象。
istream& operator>>(istream& in, Sales_item& s){
double price;
in >> s.isbn >> s.units_sold >> price;
if(in)
s.revenue = s.units_sold * price;
else
s = Sales_item();
return in;
}
在运行,看看:
输入正确的情况:
0-201-78345-X 2 50
0-201-43443-X
6
20
0-201-43443-X 6 120
请按任意键继续. . .
输入错误的情况:
0-201-78345-X 2 50
0-201-43343-X
aobosir
0 0
请按任意键继续. . .
完整的代码:
#include <iostream>
#include <string>
using namespace std;
class Sales_item{
public:
Sales_item(string &book, unsigned units, double price):
isbn(book), units_sold(units), revenue(price*units){}
Sales_item():units_sold(0), revenue(0.0){}
friend ostream& operator<<(ostream& out, const Sales_item& s);
friend istream& operator>>(istream& in, Sales_item& s);
private:
string isbn;
unsigned units_sold;
double revenue;
};
ostream& operator<<(ostream& out, const Sales_item& s){
out << s.isbn << "\t" << s.units_sold << "\t" << s.revenue ;
return out;
}
istream& operator>>(istream& in, Sales_item& s){
double price;
in >> s.isbn >> s.units_sold >> price;
if(in)
s.revenue = s.units_sold * price;
else
s = Sales_item();
return in;
}
int main(){
Sales_item item(string("0-201-78345-X"), 2, 25.00);
cout << item << endl;
cin >> item;
cout << item << endl;
system("pause");
return 0;
}
C++ 重载操作符- 02 重载输入输出操作符的更多相关文章
- C#操作符的重载
操作符也是可以重载的,先总结一下操作符的性质: 如我们所知,操作符在不同的情况下有不同的语义,具体取决于它所操作的类型.例如,操作符“+”在操作数值类型的时候意味着“加”,在操作字符串时意味着“连接” ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- C++ Primer 学习笔记_62_重载操作符与转换 --调用操作符和函数对象
重载操作符与转换 --调用操作符和函数对象 引言: 能够为类类型的对象重载函数调用操作符:一般为表示操作的类重载调用操作符! struct absInt { int operator() (int v ...
- 【转】c++ new操作符的重载
基本概念: 1. 操作符重载:C++支持对某个操作符赋予不同的语义 2. new操作符:申请内存,调用构造函数 关于c++ new操作符的重载 你知道c++ 的new 操作符和operator new ...
- C++中前置操作符和后置操作符的重载
1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++ // i 的值作为返回值,i 自增 1: ...
- cc22a_demo_c++重载自增自减操作符-代码示范
cc22a_demo_c++重载自增自减操作符-代码示范 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespa ...
- C++解析七-重载运算符和重载函数
重载运算符和重载函数C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列 ...
- C++语法小记---前置操作符和后置操作符
前置操作符和后置操作符 单独的"++i"和"i++"是否有区别 对于基本类型: 二者没有区别,因为编译器会对代码进行优化,二者的汇编代码完全相同 对于类类型: ...
- Javascript赋值语句中的“&&”操作符和"||"操作符
有这么一种常见的语句: var a = a || 4; 那赋值语句中的"&&"操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数 ...
随机推荐
- bzoj 1101 [POI2007]Zap——反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 #include<cstdio> #include<cstring& ...
- linux通过wget直接下载jdk,避免用户验证
下载地址 :http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 下载语句: wget ...
- curl 无法访问 https 协议
转自http://blog.mutoo.im/2013/12/curl-could-not-communicate-with-https-sites.html mac升级为10.10以后,homebr ...
- js 理解闭包
学习Javascript闭包(Closure) 引用: 阮一峰 http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures. ...
- Jenkins的pipeline
说明 再官网文档上有说明pipeline的工作流程,具体可以参考pipeline文档和语法文档. 这里将pipeline的生命周期图贴出来 我们暂时不会用到完整的流程,只摘取有用的部分,完成最小的流 ...
- Spring Cloud Bus 消息总线 RabbitMQ
Spring Cloud Bus将分布式系统中各节点通过轻量级消息代理连接起来. 从而实现例如广播状态改变(例如配置改变)或其他的管理指令. 目前唯一的实现是使用AMQP代理作为传输对象. Sprin ...
- java http头信息
JAVA 从http请求头中获取Header信息: request.getHeader(),request.getHeaderNames(),request.getHeaders() Java获取Ht ...
- ESXI5.5开启snmp+zabbix 监控esxi 需要开启的服务
esxcli system snmp set --communities public esxcli system snmp set --enable trueesxcli network firew ...
- py基础2--列表,元祖,字典,集合,文件
本节内容 列表.元祖操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 三元运算&生成式&成员运算&解压法&队列堆栈&数据类型转换 1. 列表操作 ...
- [转]搭建MySQL高可用负载均衡集群
转自:http://www.cnblogs.com/phpstudy2015-6/p/6706465.html 阅读目录 1.简介 2.基本环境 3.配置MySQL主主复制 4.中间件简述 4.1.H ...