ITPub博客

首页 > 应用开发 > > 将函数的返回值定义为引用

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

作者:zhjhome 时间:2019-09-02 14:12:52 0 删除 编辑

版权声明:原文发表于http://blog.zollty.com,转载请注明出处。

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

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

[cpp]view plaincopy print?

#include  

#include  

using namespace std;  

char & get_val(string &str,int i)//返回类型为引用  

{//若去掉返回值的引用,则返回的是一个无名变量,其值是返回内容的一个拷贝而已,见下一个程序。  

return str[i];  

}  

int main()  

{  

string s("123456");  

cout<

get_val(s,2)='a';   //即等价于:str[2]='a',因为get_val(s,2)返回的是引用,故相当于str[2]  

cout<

return 0;  

}  

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

[cpp]view plaincopy print?

#include  

#include  

using namespace std;  

char get_val(string &str,int i)//返回类型不为引用  

{  

return str[i];  

}  

int main()  

{  

string s("123456");  

cout<

char p;  

p=get_val(s,2);//因为函数get_val()返回值不是引用,所以必须赋值给一个变量后才能使用。  

cout<

return 0;  

}  

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

[cpp]view plaincopy print?

ostream & operate <<(ostream &output, Complex &c)//定义流提取运算符“<<”重载函数  

{  

output<<”(”<

return output;  

}  

  

cout

因为输出c3后紧接着要输出c2,所以要求cout<

 

请自行分析下面的程序:

[cpp]view plaincopy print?

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的地址不等。

 

返回指针的情形

例如:

[cpp]view plaincopy print?

#include  

char *RetMemory()  

{  

char p[]="hello world\n";  

return p;  

}  

void main( )  

{  

char *str=NULL;  

    str=RetMemory();  

    printf(str);  

}  

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

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

 

 

end

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2530/viewspace-3151287/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-16

  • 博文量
    102
  • 访问量
    951