给出一个课程:
struct employee {
string name;
string ID;
string phone;
string department;
};
以下功能如何运作?
ostream &operator<<(ostream &s, employee &o)
{
s << o.name << endl;
s << "Emp#: " << o.ID << endl;
s << "Dept: " << o.department << endl;
s << "Phone: " << o.phone << endl;
return s;
}
cout << e;
为给定的employee e
生成格式化输出。
示例输出:
Alex Johnson
Emp#: 5719
Dept: Repair
Phone: 555-0174
我无法理解ostream功能是如何工作的。它是如何获得参数“ostream&amp; s”的?它如何重载“&lt;&lt;&lt;”运算符以及&lt;&lt;&lt;操作员工作?如何用它来写出关于员工的所有信息?有人可以用外行的话来回答这些问题吗?
答案 0 :(得分:8)
这称为重载决策。
您已撰写cout << *itr
。
编译器将其视为operator<<(cout, *itr);
,其中cout
是ostream
的实例,*itr
是员工的实例。
您已经定义了与您的通话最匹配的功能void operator<<(ostream&, employee&);
。
因此cout
和s
*itr
执行了o
{/ 1}}
答案 1 :(得分:1)
给出employee e;
。
以下代码:
cout << e;
会调用您的重载功能,并将引用传递给cout
和e
。
ostream &operator<<(ostream &s, const employee &o)
{
// print the name of the employee e to cout
// (for our example parameters)
s << o.name << endl;
// ...
// return the stream itself, so multiple << can be chained
return s;
}
Sidenote :对employee
的引用应该是const,因为我们不会更改它,正如πάνταῥεῖ