Operator& Return Type 是什么意思?

what does the operator& return type mean?

提问人:ming 提问时间:10/27/2019 最后编辑:HoldOffHungerming 更新时间:8/7/2020 访问量:552

问:

所以据我所知,

istream& operator >> (istream &in, int &n);

是>>如何工作的声明(或以某种方式使其超载)

但我对这个“函数”的返回类型“istream&”感到困惑。

如果我做这样的事情,比如 cin >> x;这意味着我输入了对 x 的引用,但我不理解返回类型 istream & 和参数“in”。

这个函数的定义是什么样子的?什么是“在”?它实际上返回的是什么?因为 cin >> x 除了接受输入之外确实可以做任何事情,那么为什么它必须返回任何东西呢?

谢谢!

C++ 语法运 算符重载 IOSTREAM 函数声明

评论

0赞 Ted Lyngmo 10/27/2019
它是对 .- 并且手段将被修改 - 而不是istreamistream& operator >> (istream &in, int &n);nconst <type>&n
1赞 jkb 10/27/2019
返回对流的引用是允许像这样的构造的原因cin >> x >> y
0赞 curiousguy 10/27/2019
没有标题所暗示的“”。函数名称为 (两个标记),是用于指示引用类型的不相关标记。所以不是一回事。&operatoroperator >>&&operator
0赞 Ted Lyngmo 10/27/2019
@curiousguy 发现得很好 - 我改变了它
1赞 curiousguy 10/27/2019
@ming 你需要学会破译声明东西(变量或函数)的令人惊讶但内部一致的 C/C++ 原则。这称为声明符:。看,是它的一部分,但不是函数名称的一部分,它只是.它的内容是:使用可修改的左值调用,其中一个正式返回一个引用,即给出一个左值。左值是引用已标识对象的表达式。& operator >> (istream &in, int &n)&operator >>operator >>istreamint

答:

0赞 Ted Lyngmo 10/27/2019 #1

这意味着在这个特定案例(以及许多其他案例)中,它是直通的。这是一个合同,用给定的输入返回一些合理的东西。返回是明智的事情,因为它可以生成以下构造:is

stream >> variableA >> variableB >> variableC

可能。这是因为返回 an 其他操作也是如此。stream >> variableAstream

评论

0赞 ming 10/27/2019
哦,对了,我忘了有不同的输出流,所以您示例中的“流”就像“cout”或“outfile”,对吧?那么,这是否意味着从技术上讲,如果我们传入 cin,我们可以返回 outfile?并假设我们传入的每个整数 n 加倍。那么,如果我们唯一返回的是输出流,那么如何返回新的 n 呢?就像我们输入参数一样,我们得到的回报只是我们输入的流(例如cin)或新流(outfile)
0赞 Ted Lyngmo 10/27/2019
@ming 非常 -.it 是一种非常开放的语言,但对它接受的内容非常挑剔:-)
0赞 curiousguy 10/29/2019
@ming 所有读/写运算符 (op<< op>>) 的规范实现是 (对于非成员) 或 (对于成员)return lhs;return *this;
0赞 3Dave 10/27/2019 #2

如果函数,

istream& operator >> (istream &in, int &n);

返回,而是,

istream operator >>....

然后,事情变得复杂了。在最坏的情况下,每次调用都会复制流对象并返回副本,然后复制副本并将其存储在调用方的堆栈中,然后调用所有被复制的东西的析构函数,特殊情况除外。>>

通过返回引用,我们可以执行链接之类的操作:

a << b << "Yo!" << c << "Wassup?" << endl;

...没有所有这些废话。

&表示“引用”,它本质上是一个指针,具有更强的编译时检查和更好的语法。

评论

0赞 curiousguy 10/27/2019
在内部,它是作为 ptr 实现的,但对于语法和语义 POV,它不是。使用引用的表达式引用对象,而不是其地址。
0赞 curiousguy 10/27/2019
还行。。。我之前的未经校对的评论羞愧地删除了,请做同样的事情。
2赞 Pontus Holmbom 10/27/2019 #3

运算符 >> 的标准实现将返回对 istream &in 参数的引用,这意味着它返回完全相同的对象。

这是为了方便起见,因此您可以编写如下代码:cin >> x >> y;

编译器将获取运算符左侧的内容,并放入第一个参数,将右侧放入第二个参数。 cin >> x >> y 将翻译成operator>>( (operator>>(cin, x), y );

这将首先将 x 添加到流中,并使用返回值(流本身),并将 y 写入其中。