何时需要从函数返回引用
When is it required to return a reference from a function?
我的问题是,什么时候需要通过引用返回对象?这是因为我们可以通过参数列表本身传递要填充的对象。是否有任何特定的情况下,它通过引用强制返回。
我是针对非成员职能提出这一问题的。
编辑:我知道它在运算符重载中的用法。
当您希望接收端能够访问引用的对象时,您需要作为引用返回。考虑映射中的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( ??? );
- 寿命延长从函数返回引用
- 了解C++如何返回引用并绑定到引用
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 从类返回引用向量
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 混淆C++从函数返回引用
- 两个相同的重载运算符[]一个返回引用
- 为什么向量的.at()成员函数返回引用而不是迭代器
- C++使用和返回引用
- 返回 T 引用的 Const 函子禁止赋值
- 返回引用是否也会延长其生存期?
- 如何返回引用,然后递增迭代器
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 我是否需要将 ref 与 make_pair 一起使用才能返回引用?
- 在 vector::at 返回引用后进行更改
- 为什么PyImport_ImportModule返回引用计数为 3 而不是 1 的 PyObject*
- 超出返回引用的单一实例生存期
- Boost.Python 返回引用现有 c++ 对象的 python 对象
- C++ 运算符 += 重载返回引用
- 如何声明接受转发引用并返回引用或副本的函数模板