$ cat main.cpp
/*
* C++重载 抽取运算符 <<
* 重载: 这个名字说得太专业,太玄乎,太不易理解.
* 用白话解释一下吧. c++库 有一个 ostream 对象就 cout.
* 这句话我就不解释了, 关于cout 搞 c++ 大家用过很多了次了. 反正就是用它向屏幕上打印东西.
* 就好比说那是"太阳", 如果再问"太阳"是什么? 我没法继续说它"太阳"就是一个发光的盘子. 这样解释就不准确了.
* ostream c++ 库已经写了很多代码了, 但是它也不认识Person 类, 打印不了Persion对象,
* 我们要继续完善ostream 类对象,让它支持Persion 对象, 我们要完善的地方是那个运算符<<
* 这就是我们要重载抽取运算符 <<
* 当你听说你要完善C++的OStream 库函数, 是不是觉得很震惊? 其是也没有那么高大上,很简单的,下面就看看实例.
* 你会了也不代表你就能发财了@_@
*/
#include <iostream>
using namespace std; //添加命名空间,否则会找不到ostream
class Person
{
public: Person(const char *name,int age):_name(name),_age(age) { }
friend ostream & operator << (ostream &out, Person &person); //声明友元则可以在类外访问该类的私有变量
private:
const char *_name;
int _age;
};
//重载了抽取操作符 << ,使支持Persion 类型(白话是添加了<<打印persion变量功能)
//相当于扩充了抽取 << 操作符的功能, 它的左手侧是this 对象,右手侧是Person对象
ostream & operator << (ostream &out, Person &person)
{
out << "name:"<<person._name << endl<<"age:"<<person._age<<endl;
return out; //返回ostream 对象则可以支持连续调用
}
int main()
{
Person person1("zhang", 30);
Person person2("wang", 40);
cout<<person1<<person2; // cout 就是一个ostream 类的对象
return 0;
}
运行结果:
$ ./test_ostream
name:zhang
age:30
name:wang
age:40