0

我有以下代码,其中包含重载输出运算符:

class Student 
{
public:
    string name;
    int age;
    Student():name("abc"), age(20){}
    friend ostream& operator<<(ostream&, const Student&);
};
ostream& operator<<(ostream& os, const Student& s)
{
    os << s.name; // Line 1
    return os;
}

我想知道如果我改成Line 1这个有什么区别:cout << s.name

4

2 回答 2

4

然后operator <<会宣传它可以将学生的姓名输出到任何流,但忽略其参数并始终输出到标准输出。作为一个类比,它类似于写作

int multiplyByTwo(int number) {
    return 4;
}

可以看出,这绝对是个问题。如果你真的想总是返回 4,那么函数应该是

int multiplyTwoByTwo() {
    return 4;
}

当然,你不能operator <<只接受一个论点,因为它是一个二元运算符,所以这就是类比失败的地方,但你明白了。

于 2012-05-07T11:28:03.330 回答
2

它不会调用operator <<on os,而是 on coutcout也是一个ostream,但不是唯一的。

例如,如果你想输出到一个文件,你会有一个fstream. 你写

fstream fs;
Student s;
fs << s;

输出不会打印到文件中,而是打印到cout,这不是您想要的。

这就像说,“你可以输出一个学生到任何ostream你想要的,它仍然会被打印到控制台”。

于 2012-05-07T11:27:44.527 回答