c++ - 什么时候需要从函数返回引用?

标签 c++

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

我问的是关于非成员函数的问题。

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

最佳答案

当您希望接收端可以访问被引用的对象时,您需要作为引用返回。考虑 map 中的 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 的所有情况下(在函数中返回对具有自动存储的变量的引用是未定义的行为,但在所有情况下在这样做是正确的情况下,如果您用任何其他解决方案更改它,语义将不一样。

关于c++ - 什么时候需要从函数返回引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6368614/

相关文章:

c++ - static_assert 如何用于检查模板函数的迭代器参数的元素类型?

c++ - cpp : "-c" is not a valid option to the preprocessor

c++ - 如何使用 MySQL Connector C++ 与数据库建立连接?

c++ - Libcurl+QtCreator+debian

c++ - 将菜单项位置引用到同一菜单中的另一个菜单项

c++ - 在二维数组中生成随机数时保证特定数字的 X 数量的任何方法

C++ 是内存泄漏吗?指向在另一个函数中动态分配的数组的指针

c++ - 如何在一个节点指向多个其他注释的地方创建链表?

c++ - 如何一起使用Opencv、qt creator、ming gw windows?

c++ - 使用 block 匹配算法获取纹理点云