当你为一个类重载<<操作符时(假设这在SomeClass中被定义为朋友),为什么你们都引用ostream并返回该ostream呢?
ostream& operator<<(ostream& s, const SomeClass& c) {
//whatever
return s;
}当ostream已经可以通过引用直接修改时,返回ostream有什么好处呢?这对我来说似乎是多余的--尽管我确信它不是:)
发布于 2011-08-25 03:06:34
这不是多余的,但对于链接调用很有用。像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";看到它们的相似性和实用性了吗?
发布于 2011-08-25 02:59:06
它允许将输出“链接”在一起。如下所示:
std::cout << someObj << someValue;这相当于如下所示:
operator<<(operator<<(std::cout, someObj), someValue);发布于 2011-08-25 02:57:41
因此,您可以将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。
https://stackoverflow.com/questions/7180731
复制相似问题