返回引用的函数

#include<iostream.h>int&fun(int&i);intmain(){inta;cout<<fun(a)<<endl;return0;}int&fun... #include<iostream.h>int &fun(int &i);int main(){ int a; cout<<fun(a)<<endl; return 0;}int &fun(int &i){ i=2; return i;}函数fun前有&,若不加也能运行正确,这和加了&的fun函数有啥区别?老师说返回的值是个变量,是这样吗?请详细解释下,谢谢。 展开
 我来答
匿名用户
2013-10-23
展开全部
楼上几位说的基本详细了,就是返回引用的意思,指返回值是一个引用。你老师说错了。
所谓返回引用是指返回一个已存在对象的引用,(切记一定要是已经存在的)
所谓引用其实就是包装指针的一个语法糖,
所谓语法糖就是说使用引用的地方用指针也可以实现,只不过要写更多的代码。

教科书上对引用这种数据类型讲得很简单,用它给变量起“别名”的作用甚至让人觉得它是多余的!
其实它真正的用武之地是在参数传递中!
众所周知在C语言中不论是从实参到形参,还是从局部变量到返回值,都是清一色的值传递。
值传递意味着全拷贝,不仅效率低下,更多的时候它也并非是你想要的语义。
试想你要去月球,现在从你身上取一个细胞克隆出一个与你同样的人,让它去完成你的探月计划,
然后回来给你讲它的所感所受,或许你能听得身临其境,并且它的成功证明换成你也行,但这是你想要的吗?

T fun(T t){return t;} void main() {T t; t=fun(t);}
在上面的代码中你能发现几个变量?
1.主函数main()中定义了局部变量t
2.调用fun()函数时,自动产生一个局部变量(也就是形参表中的变量t)用于接受实参的值
3.函数fun()返回它自己的形参变量t时,又自动了产生一个匿名临时变量用于存放返回值

T& fun(T& t){return t;} void main() {T t; t=fun(t);}
与上面的代码相比较,不存在第2个和第3个变量。

使用引用常见有以下几种情形:(很不全面,抛砖引玉)
情形一:返回函数实参 T& fun(T& t){return t;}
情形二:返回静态变量 T& fun(){static T t; return t;}
情形三:返回当前对象 T& T::fun(){return *this;}
情形四:返回新建对象 T& fun(){return *new T;}
注意与最后一种情形类似但不等价的指针形式如下:
T& fun(){T* pt=new T(); return *pt;} //除非显式调用delete,否则对象(*pt)不会被释放!
匿名用户
2013-10-23
展开全部
返回引用就说返回这个变量本身,它可以做左值

int &fun(int &i);int main(){ int a; cout<<fun(a)<<endl;fun(a)=10;////////这个
cout<<a<<endl; return 0;}int &fun(int &i){ i=2; return i;}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
低调侃大山
推荐于2017-09-08 · 家事,国事,天下事,关注所有事。
低调侃大山
采纳数:67731 获赞数:374583

向TA提问 私信TA
展开全部
C++之中函数的返回分为以下几种情况:
1)返回非引用类型:函数的返回值用于初始化在跳出函数时候创建的临时对象。用函数返回值来初始化临时对象与用实参初始化形参的方法是一样的。如果返回类型不是引用的话,在函数返回的地方,会将返回值复制给临时对象。且其返回值既可以是局部对象,也可以是表达式的结果。
2)返回引用:当函数返回引用类型的时候,没有复制返回值,而是返回对象的引用(即对象本身)。
函数返回引用:实际上是一个变量的内存地址,既然是内存地址的话,那么肯定可以读写该地址所对应的内存区域的值,即就是“左值”,可以出现在赋值语句的左边。
《@》函数返回引用的时候,可以利用全局变量(作为函数返回),或者在函数的形参表中有引用或者指针(作为函数返回),这两者有一个共同点,就是返回执行完毕以后,变量依然存在,那么返回的引用才有意义。
小结:
(1)使用引用当作函数参数和返回值,效率更高。
(2)函数返回的对象引用,必须在调用函数前就已经存在,不允许返回局部变量的引用!
(3)当不希望返回的对象被修改的时候,可以添加const。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-10-23
展开全部
函数的返回值,大体可以分为3种:返回非引用,返回引用,返回引用左值1、返回非引用
string make_plural(size_t i,const string &word,const string &ending)
{
return (i==1)?word:word+ending;
}

以上函数,当i等于1时,函数返回word形参的副本;当i不等于1时函数返回一个临时的string对象,这个临时对象是由字符串word和ending相加而成的。这两种情况下,return都在调用该函数的地方防复制了返回的string对象。
2、返回引用

const string &shorterString(const string &s1,const string &s2)
{
return s1.size()<s2.size()?s1:s2;
}

以上函数的返回值是引用类型。无论返回s1或是s2,调用函数和返回结果时,都没有复制这些string对象。
注意:不要返回局部对象的引用
const string &mainip(const string &s)
{
string ret=s;
return ret;
}

当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。(我在dev c++里运行通过。。。。 但是vc6和vc2008不能编译通过)。同理,也不能返回局部对象的指针。
3、返回引用左值

char &get_val(string &str,string::size_type ix)
{
return str[ix];
}

使用语句调用:
string s("123456");
cout<<s<<endl;
get_val(s,0)='a';
cout<<s<<endl;
把函数应用于左值。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式