我有以下代码和过载输出操作符:
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
会有什么区别?{/ 1}}
答案 0 :(得分:4)
然后operator <<
会宣传它可以将学生的名字输出到任何流,但忽略其参数并始终输出到标准输出。作为类比,它类似于写作
int multiplyByTwo(int number) {
return 4;
}
你可以看到这绝对是一个问题。如果你真的想总是返回4,那么该函数应该是
int multiplyTwoByTwo() {
return 4;
}
当然你不能让operator <<
只接受一个参数,因为它是一个二元运算符,所以这就是类比分解的地方,但是你得到的结论。
答案 1 :(得分:2)
它不会在operator <<
上拨打os
,而是在cout
上。 cout
也是ostream
,但不是唯一的。
例如,如果要输出到文件,则会有fstream
。你写了
fstream fs;
Student s;
fs << s;
输出不会打印到文件,而是打印到cout
,这不是您想要的。
这就像是在说,“你可以将学生输出到你想要的任何ostream
,它仍然会被打印到控制台”。