Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2332
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 25
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-11 17:17
文章分类

全部博文(2)

文章存档

2017年(2)

我的朋友
最近访客

分类: C/C++

2017-07-19 17:22:22

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

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

[cpp] view plain copy
 print?
  1. #include  
  2. #include  
  3. using namespace std;  
  4. char & get_val(string &str,int i)//返回类型为引用  
  5. {//若去掉返回值的引用,则返回的是一个无名变量,其值是返回内容的一个拷贝而已,见下一个程序。  
  6.     return str[i];  
  7. }  
  8. int main()  
  9. {  
  10.     string s("123456");  
  11.     cout<
  12.     get_val(s,2)='a';   //即等价于:str[2]='a',因为get_val(s,2)返回的是引用,故相当于str[2]  
  13.     cout<
  14.     return 0;  
  15. }  

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

[cpp] view plain copy
 print?
  1. #include  
  2. #include  
  3. using namespace std;  
  4. char get_val(string &str,int i)//返回类型不为引用  
  5. {  
  6.     return str[i];  
  7. }  
  8. int main()  
  9. {  
  10.     string s("123456");  
  11.     cout<
  12.     char p;  
  13.     p=get_val(s,2); //因为函数get_val()返回值不是引用,所以必须赋值给一个变量后才能使用。  
  14.     cout<
  15.     return 0;  
  16. }  

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

[cpp] view plain copy
 print?
  1. ostream & operate <<(ostream &output, Complex &c)//定义流提取运算符“<<”重载函数  
  2. {  
  3.        output<<”(”<
  4.        return output;  
  5. }  
  6.   
  7. cout<//调用重载后的"<<",等价于(operate <<(cout, c3))<  

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

 

请自行分析下面的程序:

[cpp] view plain copy
 print?
  1. int &func(int& a)  
  2. {  
  3.     return a;  
  4. }  
  5.   
  6. void main()   
  7. {  
  8.     int a=0;  
  9.     int b=func(a);  
  10.     printf("&a=%p, &(func(a))=%p, &b=%p\n",&a, &(func(a)), &b);// %p也可以换做%08X,用于输出内存地址  
  11. }  

执行的结果为:

0012FF7C, 0012FF7C, 0012FF78

a和b的地址不等。

 

返回指针的情形

例如:

[cpp] view plain copy
 print?
  1. #include   
  2. char *RetMemory()  
  3. {  
  4.     char p[]="hello world\n";  
  5.     return p;  
  6. }  
  7. void main( )  
  8. {  
  9.     char *str=NULL;  
  10.     str=RetMemory();  
  11.     printf(str);  
  12. }  

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

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

 

 

end

阅读(258) | 评论(0) | 转发(0) |
0

上一篇:第一篇blog

下一篇:没有了

给主人留下些什么吧!~~