“将函数的返回值定义为引用”是一种比较有效的做法。
例如(分析见程序的注释):
-
#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';
-
cout<
-
return 0;
-
}
对比一下没有返回引用的情况:
-
#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);
-
cout<
-
return 0;
-
}
显然这种函数返回值为引用的方法大有用武之地,最常见的就是用在重载流插入/提取运算符函数中,例如:
-
ostream & operate <<(ostream &output, Complex &c)
-
{
-
output<<”(”<
-
return output;
-
}
-
-
cout<
因为输出c3后紧接着要输出c2,所以要求cout<
请自行分析下面的程序:
-
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);
-
}
执行的结果为:
0012FF7C, 0012FF7C, 0012FF78
a和b的地址不等。
返回指针的情形
例如:
-
#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