自定义类型的输出
- 引言
- 示例一
- 运行结果
- 示例二
- 运行结果
- 注意点
引言
当自己定义的数据为一些复杂数据,不再为基本数据类型,这时候要使用cout输出这些数据,就需要重载输出运算符<<,这样就可以使用cout来输出自定义的数据,相同如果想使用cin来输入自定义的类型,也得定义输入运算符重载函数。
示例一
本示例将一个自定义的数据类型——结构体,其类型的数据存入到一个链表中,需要输出当前的链表中的数据。
下面是一个简单的示例的代码。
#include <iostream>
#include <list>using namespace std;
struct person {string name;int age;string gender;person(string name,int age,string gender) {this->name = name;this->age = age;this->gender = gender;}
};ostream& operator<<(ostream& o, const person& per) {o << "name:" << per.name << " age:" << per.age << " gender:" << per.gender;return o;
}int main()
{list<person> listPerson;listPerson.emplace_back("liyang", 2, "man");for (const auto &val :listPerson) {cout << val << " ";}cout << endl;return 0;
}
运行结果
示例二
在示例一的基础上,增加输入运算符的重载,可以输入自定义类型的数据。
下面是代码实现:
#include <iostream>
#include <list>using namespace std;
struct person {string name;int age;string gender;person() {name = "";age = 0;gender = "";}person(string name,int age,string gender) {this->name = name;this->age = age;this->gender = gender;} friend ostream& operator<<(ostream& o, const person& per) {o << "name:" << per.name << " age:" << per.age << " gender:" << per.gender;return o;}friend istream& operator>>(istream &i,person & p) {i >> p.name >> p.age >> p.gender;return i;}
};int main()
{list<person> listPerson;listPerson.emplace_back("liyang", 2, "man");for (const auto &val :listPerson) {cout << val << " ";}cout << endl;person obj2;cout << "please input name ,age,gender:" << endl;cin >> obj2;//每输入一个字段之后需要换行listPerson.emplace_front(obj2);for (const auto& val : listPerson) {cout << val << " "<< endl;}return 0;
}
运行结果
注意点
- 重载输出运算符<<时,不能定义为成员函数,可以放在自定义类型的外面,也可以将其定义为该类的友元函数。
- 输出运算符重载需要传入两个参数,一个是输出运算符的引用,一个是自定义类型的常引用。
- 返回输出运算符的引用。