从函数返回对结构的引用

时间:2015-04-20 17:17:30

标签: c++ function reference structure

您好我正在阅读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)。我的意思是函数原型说要返回对常量结构变量的引用,但是在这个语句中,函数没有返回任何引用。我不确定是否有关于常量结构的引用或者允许在不返回数据的情况下使用函数的东西。

有人可以解释一下吗??

4 个答案:

答案 0 :(得分:0)

你说:

  

但在此声明中,该函数未返回任何引用。

这是不正确的。该函数仍返回const引用。在通话时忽略返回值。

您可以使用:

sysop const& ref = use (looper);

捕获函数的返回值。

答案 1 :(得分:0)

  困惑我的陈述是使用(looper)。我的意思是函数原型说要返回对常量结构变量的引用,但是在这个语句中,函数没有返回任何引用。

是的,确实如此。您必须阅读整个语句,特别是在返回类型为sysop const&的情况下。这是一种参考类型。

在这种情况下,您将引用传递给函数并直接传回相同的引用。

答案 2 :(得分:0)

  

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

当您将其作为使用中的参数sysopref接受时,

use(sysop & sysopref)已经是引用。当你从函数中返回变量时,你只需要通知它。

答案 3 :(得分:0)

const sysop & use(sysop & sysopref)

use接受对类型为sysop的实例的非const引用 - 这意味着,当我们以这种方式调用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

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

试试此代码here