C++重载输入运算符<<自定义打印类信息
来源:互联网 发布:node.js高级编程 微盘 编辑:程序博客网 时间:2024/06/06 05:22
C++里面,我们想打印类的信息,需要重载<<运算符,这篇博客将介绍如何重载<<运算符打印类消息。并且介绍这么做的一些规则和原因。
重载<<运算符打印自定义类信息
我们用代码来进行说明:我们定义一个Person类,想要打印出Person类实例的age属性。
Person{ private: int age_; public: void SetAge(int age) { age_ = age; }}int main(){ Person a; a.SetAge(10); cout << a << endl;}
这样写肯定会报错,运行失败的(头文件引用,命名空间等偷懒了没写,不要在意这些细节)。我们想要 cout << a自动打印出年龄怎么办?
我们这么写,多加一个重载<<运算符的方法:
class Person{ int age_; public: void SetAge(int age) { this->age_ = age; } friend ostream &operator<<(ostream &stream, const Person &p) { stream << p.age_ << endl; return stream; }};int main(){ Person a; a.SetAge(10); cout << a << endl;}
运行程序可以看到打印出了10。
在这里,我们用一个友元函数来进行<<运算符重载,这个友元函数有个固定的格式:
friend ostream &operator<<(ostream &stream, const Person &p){ stream << p.age_ << endl; return stream;}
为了与IO标准库一致,要返回一个ostream对象的引用,接受两个参数,第一个参数是对一个ostream对象的应用,,第二个参数为一个想要打印的类类型对象的引用,你想要cout<<打印一个Person类,第二个参数就传入一个Person类的引用,这个函数也要定义成友元类。
为什么要把这个<<运算符重载定义为友元类
从语法上来说,我们的确可以把这个函数定义为类成员函数的,如下:
class Person{ int age_; public: void SetAge(int age) { this->age_ = age; } ostream &operator<<(ostream &stream) { stream << age_ << endl; return stream; }};int main(){ Person a; a.SetAge(11); a << cout;}
就如代码里所示,我们把关键字friend去掉了,把第二个参数给去掉了,然后使用a << cout来打印类信息了。可以看到,如果这样定义,和其它类型的输出操作符相反了。
下面引用一段C++primer里的一段话:
相反,如果想要使用重载操作符为该类型提供 IO 操作,就必须将它们定义
为非成员函数。IO 操作符通常对非公用数据成员进行读写,因此,类通常将 IO
操作符设为友元。
也就是说,IO操作符重载函数,通常被定义为友元函数。
阅读全文
0 0
- C++重载输入运算符<<自定义打印类信息
- 自定义数组类运算符重载
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- C++--------------------------------------------运算符重载
- C#:运算符重载
- C++:运算符重载
- C++:运算符重载
- C#:运算符重载
- [C++]运算符重载
- 【c++】运算符重载
- C++:运算符重载
- HBase 事务和并发控制机制原理
- SQL Server 触发器的使用,实现多字段自增长
- HeadFirstJava 12 图形用户接口
- 天天特惠系统秒杀优化方案
- Castle.MVC框架介绍
- C++重载输入运算符<<自定义打印类信息
- UOJ #34. 多项式乘法
- 在asp.net页面上得到Castle容器的实例
- maven整合ssm遇到的小问题2
- CNTK-window-cpu-only编译包安装
- Ip地址查询
- 第一讲 MyBatis开端
- qduoj 140 题目6 142 ycb的ACM进阶之路
- MVC结构简介