何时需要从函数返回引用

When is it required to return a reference from a function?

本文关键字:返回 引用 函数 何时需      更新时间:2023-10-16

我的问题是,什么时候需要通过引用返回对象?这是因为我们可以通过参数列表本身传递要填充的对象。是否有任何特定的情况下,它通过引用强制返回。

我是针对非成员职能提出这一问题的。

编辑:我知道它在运算符重载中的用法。

当您希望接收端能够访问引用的对象时,您需要作为引用返回。考虑映射中的operator[]和用例:

std::map<std::string, int> word_count;
std::string word;
while ( std::cin >> word ) {
   word_count[ word ]++;
}

您不想从地图中提取值,而是访问存储的对象来修改它。许多其他设计也是如此,您需要访问一些内部数据,但不想复制它:

if ( person.name() == "Pete" ) {

用户不需要复制对象,只需要检查对象是否具有具体值。您可以通过按值返回来强制复制,语义将是相同的,但成本更高。或者,您可以创建一个局部变量,并通过引用将其传递给一个函数来填充它,在这种情况下,您不仅要承担复制成本,还会使代码变得更麻烦:

std::string name;
person.fill_name( name );
if ( name == "Pete" ) {

正如您可能注意到的,在所有成员函数的使用中,这要麻烦得多。

现在,我看到了"我对非成员职能部门提出这个问题",同样的理由适用于不同的级别。独立功能可以应用于对象,请考虑:

boost::any any = 5;
boost::any_cast<int&>( any )++;

函数any_cast是一个自由函数,但它向另一个实例返回引用。如果您需要访问实际对象而不是副本,那么引用就是解决方案。请注意,仅供阅读,您不需要参考,您还可以按值返回:

std::cout << boost::any_cast<int>( any );   // will print 6 now

类似地,在函数返回对对象的引用的所有情况下,这些对象不是参数,而是全局对象或static(返回对函数中具有自动存储功能的变量的引用是未定义的行为,但在所有正确的情况下,如果用任何其他解决方案更改,则语义将不相同。

返回对其他地方存在的对象的引用时,例如搜索表的find函数。

您也可以将其用于singleton(静态对象,创建一次,并在main()之后发布。例如:

struct A
{
   unsigned int veryLongTable[ 1000 ];
};
const A& GetTable()
{
  static A *table = NULL;
  if ( NULL == table )
  {
    table = new A;
    // write values
  }
  return *table;
}

强调引号中的挖掘

我们也可以通过对象

  • 如果该类型不是默认可构造的,该怎么办
  • 如果它根本不可构建呢
  • 如果它是可构建的,但这样做非常昂贵,该怎么办

要填充的对象

你错了:通过值返回的函数可以等价于使用引用out参数的函数,但它不等价于返回引用函数。也就是说:

T& f();
void f(T&);
// We're not filling anything at all!
f().some_member();
f( ??? );