将函数的返回值引用定义为引用

本文探讨了C++中函数返回引用的有效应用方法,并通过具体示例对比了返回引用与返回值的区别。此外,还讨论了如何正确使用返回引用以避免潜在的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“将函数的返回值定义为引用”是一种比较有效的做法。

例如(分析见程序的注释):

#include<iostream> #include<string> using namespace std; char & get_val(string &str,int i)//返回类型为引用 {//若去掉返回值的引用,则返回的是一个无名变量,其值是返回内容的一个拷贝而已,见下一个程序。 return str[i]; } int main() { string s("123456"); cout<<s<<endl; get_val(s,2)='a'; //即等价于:str[2]='a',因为get_val(s,2)返回的是引用,故相当于str[2] cout<<s<<endl; return 0; }

对比一下没有返回引用的情况:

#include<iostream> #include<string> using namespace std; char get_val(string &str,int i)//返回类型不为引用 { return str[i]; } int main() { string s("123456"); cout<<s<<endl; char p; p=get_val(s,2); //因为函数get_val()返回值不是引用,所以必须赋值给一个变量后才能使用。 cout<<p<<endl; return 0; }

显然这种函数返回值为引用的方法大有用武之地,最常见的就是用在重载流插入/提取运算符函数中,例如:

ostream & operate <<(ostream &output, Complex &c)//定义流提取运算符“<<”重载函数 { output<<”(”<<c.real<<”+”<<c.imag<<”i)”<<endl; return output; } cout<<c3<<c2; //调用重载后的"<<",等价于(operate <<(cout, c3))<<c2;

因为输出c3后紧接着要输出c2,所以要求cout<<c3(即operate <<(cout, c3))必须返回流提取对象cout,故必须使函数operate <<(cout, c3)的返回值能直接使用,即:必须将函数返回值设置为引用。

请自行分析下面的程序:

int &func(int& a) { return a; } void main() { int a=0; int b=func(a); printf("&a=%p, &(func(a))=%p, &b=%p\n",&a, &(func(a)), &b);// %p也可以换做%08X,用于输出内存地址 }

执行的结果为:

0012FF7C, 0012FF7C, 0012FF78

a和b的地址不等。

返回指针的情形

例如:

#include <stdio.h> char *RetMemory() { char p[]="hello world\n"; return p; } void main( ) { char *str=NULL; str=RetMemory(); printf(str); }

分析:str能得到p吗?不能!因为函数调用结束后p的内存就被回收了,所以最好是利用传参数的形式定义p或者将p定义为全局变量。

所以要避免返回 指向函数内部定义的变量或字符串常量 的指针。

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值