繁体   English   中英

从函数返回对结构的引用

[英]Returning a reference to a structure from a function

嗨,我正在阅读有关c ++中的引用变量的信息,并正在阅读有关对结构的引用,并从函数返回对结构的引用。 我读的示例代码如下:

#include <iostream>
using namespace std;

struct sysop {
  char name[26];
  char quote[64];
  int used;
};

const sysop & use(sysop & sysopref);

int main()
{
  sysop looper = {"Rick Looper", "I'm a goto kind of guy.", 0};
  use (looper);
  cout << “Looper: “ << looper.used << “ use(s)\n”;
  sysop copycat;
  copycat = use(looper);
  cout << “Looper: “ << looper.used << “ use(s)\n”;
  cout << “Copycat: “ << copycat.used << “ use(s)\n”;
  cout << “use(looper): “ << use(looper).used << “ use(s)\n”;
  return 0;
}

const sysop & use(sysop & sysopref)
{
  cout << sysopref.name << “ says:\n”;
  cout << sysopref.quote << endl;
  sysopref.used++;
  return sysopref;
}

这是来自C ++ Primer Plus的书。 无论如何,我理解了示例,但令我感到困惑的是use(looper) 我的意思是函数原型说要返回对常量结构变量的引用,但是在此语句中,函数不返回任何引用。 我不确定是否有关于常量结构的引用或允许函数在不返回数据的情况下使用的特殊内容。

有人可以向我解释一下吗?

你说:

但是在此语句中,该函数未返回任何引用。

那是不对的。 该函数仍返回const引用。 返回值在调用时被忽略。

您可以使用:

sysop const& ref = use (looper);

捕获函数的返回值。

令我感到困惑的是use(looper)。 我的意思是函数原型说要返回对常量结构变量的引用,但是在此语句中,函数不返回任何引用。

是的,它确实。 您必须阅读整个语句,尤其是在声明返回类型为sysop const& 这是参考类型。

在这种情况下,您可以将引用传递给函数,然后直接返回相同的引用。

我的意思是函数原型说要返回对常量结构变量的引用,但是在此语句中,函数不返回任何引用。

当您接受sysopref作为使用中的参数use(sysop & sysopref)时,它已经是参考。 当您从函数返回变量时,只需对它进行香奈儿。

const sysop & use(sysop & sysopref)

use接受对sysop类型实例的非常量引用-这意味着,当我们调用时,请use这种方式:

sysop s;
use(s);

use直接在s工作,而不是在它的副本上工作(这是引用的工作方式)。 这是必需的,因为use修改了其参数:

sysopref.used++;

但是,它返回其参数作为const引用(可能避免进一步的修改或其他操作)。 没关系,该参数是非const引用-它是“提升”的(但反之亦然)。

因此,在此调用序列之后:

sysop s;
const sysop& ret_ref = use(s);

ret_ref将是对s的引用(它们将共享内存并包含完全相同的数据)。 看这个例子:

int main()
{
    sysop s;
    s.used = 0;

    const sysop& ret_ref = use(s);

    std::cout<<s.used<<std::endl;
    std::cout<<ret_ref.used<<std::endl<<std::endl;

    std::cout<<&(s)<<std::endl;
    std::cout<<&(ret_ref)<<std::endl;

    return 0;
}

输出:

1
1

0xbfc910f0
0xbfc910f0

如您所见,它们的内存地址完全相同,因此函数确实返回了传递的参数。

在此处尝试此代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM