【问题标题】:what does the operator& return type mean?运算符和返回类型是什么意思?
【发布时间】:2019-10-27 00:57:46
【问题描述】:

据我所知,

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

是关于>>如何工作的声明(或以某种方式重载它)

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

如果我做类似 cin >> x;这意味着我在引用 x,但我不明白返回类型 istream & 和参数“in”。

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

谢谢!

【问题讨论】:

  • 这是对istream 的引用。 - 和 istream& operator >> (istream &in, int &n); 表示 n 将被修改 - 而不是 const <type>&n
  • 返回对流的引用是允许构造像cin >> x >> y
  • 正如您的标题所暗示的那样,没有“&operator”。函数名称为operator >>(两个标记),& 是一个不相关的标记,用于指示引用类型。所以&operator 不是一个东西。
  • @curiousguy 很好发现 - 我改了
  • @ming 你需要学会破译令人惊讶但内部一致的 C/C++ 声明东西(变量或函数)的原则。这称为 声明符& operator >> (istream &in, int &n)。看,& 是它的一部分,但不是函数名称的一部分,它只是 operator >>。它的内容是:使用可修改的左值istream 调用operator >>int 之一正式返回一个引用,即给出一个左值。左值是引用已识别对象的表达式。

标签: c++ syntax operator-overloading iostream function-declaration


【解决方案1】:

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

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

编译器会取操作符left一侧的内容,并将first参数和right放入 >第二。 cin >> x >> y 将转换为operator>>( (operator>>(cin, x), y );

这将首先将 x 添加到流中并使用返回、流本身,然后将 y 写入其中。

【讨论】:

    【解决方案2】:

    如果函数,

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

    返回,而不是,

    istream operator >>....
    

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

    通过返回一个引用,我们可以做一些事情,比如链接:

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

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

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

    【讨论】:

    • 在内部它被实现为一个 ptr,但对于语法和语义 POV,它不是。使用引用的表达式引用对象而不是其地址。
    • 好的...我之前的未校对评论因耻辱而被删除,请照办。
    【解决方案3】:

    这意味着在这种特殊情况(以及许多其他情况)中它是一个 pass-thru。根据给定的输入返回一些合理的东西是一个合同。返回is 是明智之举,因为它会生成如下结构:

    stream &gt;&gt; variableA &gt;&gt; variableB &gt;&gt; variableC

    可能。那是因为stream &gt;&gt; variableA 返回stream,其他操作也是如此。

    【讨论】:

    • 哦对了,我忘了有不同的输出流,所以你的例子中的“流”就像“cout”或“outfile”对吗?那么这是否意味着从技术上讲,如果我们传入 cin,我们可以返回 outfile?假设我们将传入的每个整数 n 加倍。那么如果我们返回的唯一内容是输出流,那么新的 n 又如何返回呢?就像我们输入参数一样,我们得到的只是我们输入的流(例如 cin)或新的流(outfile)
    • @ming 非常 -。它是一种非常开放的语言,但它接受的内容非常挑剔:-)
    • @ming 所有读/写运算符 (op>) 的规范 impl 是 return lhs;(对于非成员)或 return *this;(对于成员)
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 2020-12-07
    • 2013-05-07
    • 2015-09-18
    • 2017-03-29
    • 2011-03-16
    • 2011-07-09
    相关资源
    最近更新 更多