簡體   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