【发布时间】:2011-08-24 18:53:14
【问题描述】:
当你为一个类重载
ostream& operator<<(ostream& s, const SomeClass& c) {
//whatever
return s;
}
当它已经可以通过引用直接修改时,返回 ostream 有什么好处?这对我来说似乎是多余的-尽管我确定不是:)
【问题讨论】:
当你为一个类重载
ostream& operator<<(ostream& s, const SomeClass& c) {
//whatever
return s;
}
当它已经可以通过引用直接修改时,返回 ostream 有什么好处?这对我来说似乎是多余的-尽管我确定不是:)
【问题讨论】:
它允许将输出“链接”在一起。如:
std::cout << someObj << someValue;
这相当于:
operator<<(operator<<(std::cout, someObj), someValue);
【讨论】:
这不是多余的,但对于链接调用很有用。使用 std::string::append 之类的函数更容易看到,所以我将从它开始:
std::string mystring("first");
mystring.append(" second");
mystring.append(" third");
可以改写为:
std::string mystring("first").append(" second").append(" third");
这是可能的,因为 .append() 返回对其修改的字符串的引用,因此我们可以继续将 .append(...) 添加到末尾。与您正在做的事情相关的代码正在改变:
std::cout << "first";
std::cout << " second";
std::cout << " third";
进入这个。由于 operator
std::cout << "first" << " second" << " third";
看到相似之处和有用性了吗?
【讨论】:
这样您就可以将operator<< 的链式调用编写为:
stream << s1 << s2 << s3 ;
如果不返回ostream&,则不能多次写入。
你可以这样想:
operator<<(operator<<(operator<<(stream, s1), s2), s3);
或者作为,
((stream << s1) << s2) << s3 ;
首先(stream << s1) 返回stream&,您再次调用<<,它变成stream << s2,它返回stream&,您再次调用<<,它变成stream << s3。
【讨论】:
啊,这是如此链接的输出,就像
cout
仍然有效。
【讨论】: