运营商如何<<超载工作?

时间:2015-10-30 07:37:20

标签: c++

给出一个课程:

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;操作员工作?如何用它来写出关于员工的所有信息?有人可以用外行的话来回答这些问题吗?

2 个答案:

答案 0 :(得分:8)

这称为重载决策。 您已撰写cout << *itr。 编译器将其视为operator<<(cout, *itr);,其中coutostream的实例,*itr是员工的实例。 您已经定义了与您的通话最匹配的功能void operator<<(ostream&, employee&);。 因此couts *itr执行了o {/ 1}}

答案 1 :(得分:1)

给出employee e;。 以下代码: cout << e;

会调用您的重载功能,并将引用传递给coute

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,因为我们不会更改它,正如πάνταῥεῖ

所指出的那样