重载输入输出操作符

本篇博客主要介绍两个操作符重载。一个是 <<(输出操作符)、一个是 >> (输入操作符)

现在就使用实例来学习:如何重载输入和输出操作符。

#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 重载输入输出操作符的更多相关文章

  1. C#操作符的重载

    操作符也是可以重载的,先总结一下操作符的性质: 如我们所知,操作符在不同的情况下有不同的语义,具体取决于它所操作的类型.例如,操作符“+”在操作数值类型的时候意味着“加”,在操作字符串时意味着“连接” ...

  2. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  3. C++ Primer 学习笔记_62_重载操作符与转换 --调用操作符和函数对象

    重载操作符与转换 --调用操作符和函数对象 引言: 能够为类类型的对象重载函数调用操作符:一般为表示操作的类重载调用操作符! struct absInt { int operator() (int v ...

  4. 【转】c++ new操作符的重载

    基本概念: 1. 操作符重载:C++支持对某个操作符赋予不同的语义 2. new操作符:申请内存,调用构造函数 关于c++ new操作符的重载 你知道c++ 的new 操作符和operator new ...

  5. C++中前置操作符和后置操作符的重载

    1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: ...

  6. cc22a_demo_c++重载自增自减操作符-代码示范

    cc22a_demo_c++重载自增自减操作符-代码示范 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespa ...

  7. C++解析七-重载运算符和重载函数

    重载运算符和重载函数C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列 ...

  8. C++语法小记---前置操作符和后置操作符

    前置操作符和后置操作符 单独的"++i"和"i++"是否有区别 对于基本类型: 二者没有区别,因为编译器会对代码进行优化,二者的汇编代码完全相同 对于类类型: ...

  9. Javascript赋值语句中的“&&”操作符和"||"操作符

    有这么一种常见的语句: var a = a || 4; 那赋值语句中的"&&"操作符和"||"操作符是什么意思?如何知道这两个逻辑操作符两旁的数 ...

随机推荐

  1. checkstyle简单使用说明

    checkstyle对检查代码规范问题的总结,虽然还不够只能,但已经比较强大.1.Cyclomatic Complexity is X (max allowed is X). 问题说明:圈复杂度过高. ...

  2. git 修改提交说明 commit message

    修改最近一次的提交说明 1.代码未推送到远程服务器 $ git commit --amend 此指令会打开文本编辑器,第二行就是提交说明,修改完后按 ctrl+x 退出,后面根据提示操作. 2.代码已 ...

  3. oracle版本及字符集查询

    查询oracle版本:select * from v$version; 查询oracle字符集:select * from nls_database_parameters;

  4. 打包python文件,让文件程序化

    通过对源文件打包,Python程序可以在没有安装 Python的环境中运行,也可以作为一个独立文件方便传递和管理. 现在网上主流的打包方式有两种py2exe或者pyinstaller两款多平台的Pyt ...

  5. String笔试面试题

    Java中String类由于其特殊性(不变类),几乎是笔试面试中的必考题,当然有些题目其实没啥意思,不过关键是要通过题目掌握原理性的东西.下面六道题目,如果您全部做对了,且明白其所以然,那么Java中 ...

  6. linux 时钟时间,用户CPU时间,系统CPU时间 .

    之前看过几次这几个的概念,但还是老是记不住,干脆就直接写下来,以后方便看~ 所谓的时钟时间又叫做墙上时钟时间,它是进程运行的时钟总量,其值与系统中同时运行的进程数有关,不过一般在讨论时钟时间的时候都是 ...

  7. (转)Inno Setup入门(十三)——Pascal脚本(2)

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250933 事件函数(2) function CheckPassw ...

  8. Hibernate学习8—Hibernate 映射关系(多对多)

    第二节:Hibernate 多对多映射关系实现   比如学生和课程是多对多的关系: 一个学生可以选多个课程: 一个课程可以被多个学生选中,所以是多对多的关系:   1,多对多单向实现: 单向关系: 这 ...

  9. java代码---------实现File的目录下创建文本文档

    总结:虽然他没教给我们很多,但是他已经很棒了 package com.a.b; import java.io.*; public class dd { public static void main( ...

  10. 第五章 用Helm部署Istio

    5.1 Istio Chart概述 Helm是目前Istio官方推荐的安装方式.还可以对输入值进行一些调整,完成对Istio的部分配置工作.Istio Chart是一个总分结构,其分级结构和设计结构是 ...