函数返回引用的好处
① c++中为什么要函数返回引用
1
c++标准来中没有所谓的“c++为什么返回源引用的函数的形参也必须是传引用”的规定。
2
在你的例子里(很奇怪的用法,为什么不直接
cp1
=
cp2;呢),不能去掉"&"的原因如下:
如果没了参数的"&",那么这个returnme函数所做的事情就是将cp1复制给临时对象a,
然后返回a的引用,之后相当于a
=
cp2;
再之后过了这一行,a
的生命周期完结了。
而cp1本身自然不受影响。
ps:
如果你对“生命周期”或者
返回局部对象的引用
这些概念不熟悉的话,请参阅
effective
c++(这本薄书看明白了,那
c++
区的绝大多数问题都难不住你了)
② c++函数返回 使用引用返回的好处
普通返回 在返回机制下 会将返回值复制到临时变量区 通过函数去调用来得到这个返回值
而返回引用 则跳过了拷贝这一环节
③ 返回引用的函数
C++之中函数的返回分为以下几种情况:
1)返回非引用类型:函数的返回值用于初始化在跳出内函数时容候创建的临时对象。用函数返回值来初始化临时对象与用实参初始化形参的方法是一样的。如果返回类型不是引用的话,在函数返回的地方,会将返回值复制给临时对象。且其返回值既可以是局部对象,也可以是表达式的结果。
2)返回引用:当函数返回引用类型的时候,没有复制返回值,而是返回对象的引用(即对象本身)。
函数返回引用:实际上是一个变量的内存地址,既然是内存地址的话,那么肯定可以读写该地址所对应的内存区域的值,即就是“左值”,可以出现在赋值语句的左边。
《@》函数返回引用的时候,可以利用全局变量(作为函数返回),或者在函数的形参表中有引用或者指针(作为函数返回),这两者有一个共同点,就是返回执行完毕以后,变量依然存在,那么返回的引用才有意义。
小结:
(1)使用引用当作函数参数和返回值,效率更高。
(2)函数返回的对象引用,必须在调用函数前就已经存在,不允许返回局部变量的引用!
(3)当不希望返回的对象被修改的时候,可以添加const。
④ 引用作为函数的参数有什么优缺点
使用引用传参的话来,在函数自中对该变量所做的修改,在函数返回后依然存在。这未必是程序员所希望的。
⑤ 关于函数的返回引用
const Counter & Counter::operator ++()
{
++itsVal;
return *this;
}
-----------------------------------------------------
我就是不明白楼主说的函数本身是什么意思,函数只有名字,参数,返回值,那楼主说的本身是指的什么呢?
const Counter & 就是说函数返回一个引用
return *this;就是返回类实例本身;
比如
Counter a;
a++;//这里++就要调用上面的函数
//返回引用是为了实现左值功能
----------------------------------------------------------------------------------------------------------------------
我最主要想问得就是函数本事是不是一个引用,返回值就是引用值吗?
------------------------------------------
函数本身 是什么意思?
区别不同函数就是函数名,函数参数,函数返回值
int &fun(int &a){return a;}
函数返回的就是一个引用
函数返回引用,要慎重,一定要保证函数结束后,返回的引用是有效的
int &fun(){int a=0;int &b=a;return b;}//错误,函数返回后,局部变量已经被释放
既然是返回引用那么为什么不是&a?
------------------------------------------
int &a; //声明变量的时候&才表示引用
return &a;//这里&是取地址,就是一个指针,函数声明为返回指针;
可以比较下面的三个函数声明:
int *fun(){return &a;}//正确
int &fun(){return &a;}//错误
int &fun(){return a;}//正确
-------------------------------------------
⑥ C++中返回引用的作用是什么没有&就是不引用也没多大问题吧
引用:
作为返回值
引用作为返回值的时候,有一些规则必须遵守。这些规则包括:
不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。
不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
另外,引用也常常与一些操作符的重载相关:
流操作符<<和>>。这两个操作符常常希望被连续使用,例如:cout << "hello" << endl;因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是唯一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。
赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的唯一返回值选择。
在另外的一些操作符中,却千万不能返回引用:
+-*/四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。
3.4 什么时候使用引用
现在可以总结一下什么时候使用引用这个问题了。首先我们要看看什么时候必须使用引用:
流操作符<<和>>、赋值操作符=的返回值
拷贝构造函数的参数、赋值操作符=的参数
其它下面的情况都是推荐使用引用,但是也可以不使用引用。如果不想使用引用,完全可以使用指针或者其它类似的东西替代:
异常catch的参数表
大对象作为参数传递
返回容器类中的单个元素
返回类数据成员(非内建数据类型成员)
返回其它持久存在的,且获得者不负责销毁的对象
另外一些情况下,不能返回引用:
+-*/四则运算符
⑦ 对返回值引用的理解 和什么时候一定用~~ 急!!
当返回结果需要做为左值时,就要用引用返回。即重载函数的返回结果需要出现在=左边时,必须用引用返回。如果不用引用返回,那么重载函数的返回结果会是一个临时变量,临时变量是不能放在=左边的。
⑧ C++中一个函数返回是个引用的作用,我很菜,谁跟我说说…
#include<iostream.h>
int &min(int &i,int &j)
{
if(i<=j)
return i;
else
return j;
}
void main()
{
int a=3,b=4;
min(a,b)=5;
cout<<"a="<<a<<" b="<<b<<endl;
}
⑨ 返回引用到底啥意思
C++之中函数的返回分为以下几种情况:
1)返回非引用类型:函数的返回值用于初始化在跳出函数时候创建的临时对象。用函数返回值来初始化临时对象与用实参初始化形参的方法是一样的。如果返回类型不是引用的话,在函数返回的地方,会将返回值复制给临时对象。且其返回值既可以是局部对象,也可以是表达式的结果。
2)返回引用:当函数返回引用类型的时候,没有复制返回值,而是返回对象的引用(即对象本身)。
函数返回引用:实际上是一个变量的内存地址,既然是内存地址的话,那么肯定可以读写该地址所对应的内存区域的值,即就是“左值”,可以出现在赋值语句的左边。
《@》函数返回引用的时候,可以利用全局变量(作为函数返回),或者在函数的形参表中有引用或者指针(作为函数返回),这两者有一个共同点,就是返回执行完毕以后,变量依然存在,那么返回的引用才有意义。
小结:
(1)使用引用当作函数参数和返回值,效率更高。
(2)函数返回的对象引用,必须在调用函数前就已经存在,不允许返回局部变量的引用!
(3)当不希望返回的对象被修改的时候,可以添加const。
⑩ 引用作为函数的参数有什么优缺点
使用引用传参的话,在函数中对该变量所做的修改,在函数返回后依然存在。这未必是程序员所希望的。
使用引用传参,避免了变量复制的开销。比如参数如果是一个比较复杂的结构体,那么用引用就比直接传递来得好。