首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ostream <<重载混乱

Ostream <<重载混乱
EN

Stack Overflow用户
提问于 2011-08-25 02:53:14
回答 4查看 200关注 0票数 4

当你为一个类重载<<操作符时(假设这在SomeClass中被定义为朋友),为什么你们都引用ostream并返回该ostream呢?

代码语言:javascript
复制
ostream& operator<<(ostream& s, const SomeClass& c) {
    //whatever
    return s;
}

当ostream已经可以通过引用直接修改时,返回ostream有什么好处呢?这对我来说似乎是多余的--尽管我确信它不是:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-25 03:06:34

这不是多余的,但对于链接调用很有用。像std::string::append这样的函数更容易看到,所以我将从它开始:

代码语言:javascript
复制
std::string mystring("first");
mystring.append(" second");
mystring.append(" third");

可以重写为:

代码语言:javascript
复制
std::string mystring("first").append(" second").append(" third");

这是可能的,因为.append()返回对它修改的字符串的引用,所以我们可以继续添加.append(...)直到最后。与你正在做的事情相关的代码是这样改变的:

代码语言:javascript
复制
std::cout << "first";
std::cout << " second";
std::cout << " third";

到这里面去。因为operator<<返回流,所以我们也可以链接它们!

代码语言:javascript
复制
std::cout << "first" << " second" << " third";

看到它们的相似性和实用性了吗?

票数 4
EN

Stack Overflow用户

发布于 2011-08-25 02:59:06

它允许将输出“链接”在一起。如下所示:

代码语言:javascript
复制
std::cout << someObj << someValue;

这相当于如下所示:

代码语言:javascript
复制
operator<<(operator<<(std::cout, someObj), someValue);
票数 5
EN

Stack Overflow用户

发布于 2011-08-25 02:57:41

因此,您可以将operator<<的链式调用编写为:

代码语言:javascript
复制
stream << s1 << s2 << s3 ;

如果您不返回ostream&,那么您不能多次编写它。

你可以把它想象成:

代码语言:javascript
复制
 operator<<(operator<<(operator<<(stream, s1), s2), s3);

或者作为,

代码语言:javascript
复制
 ((stream << s1) << s2) << s3 ;

首先,(stream << s1)返回stream&,您在其中再次调用<<,它变成stream << s2,它返回stream&,您再次调用<<,它变成stream << s3

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7180731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档