函数返回值:引用类型和非引用类型
引用的概念是C++中的,C中不存在引用。
问题1:返回引用类型和非引用类型的区别。
返回非引用类型:函数的返回值用于初始化在调用函数时创建的临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样 的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。且其返回值既可以是局部对象,也可以是求解表达式的结果。
返回引用类型:当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。所以,其效率更高。
问题2:什么时候返回引用是正确的?而什么时候返回const引用是正确的?
返回指向函数调用前就已经存在的对象的引用是正确的。当不希望返回的对象被修改时,返回const引用是正确的。
问题3:什么情况下返回引用才是正确的?*********************请直接忽略问题3,这次回来看后,发现观点欠论据*********************
返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。比如:
int& abc(int a, int b, int c, int& result){
result = a + b + c;
return result;
}
或者:
int& abc(int a, int b, int c, int *result){
*result = a + b + c;
return *result;
}
这种形式是错误的:(设计思想错误,can compile and run)
int& abc(int a, int b, int c){
return a + b + c;
}
注意4:
- 返回的引用类型是左值。
- 千万不要返回局部对象的引用!千万不要返回指向局部对象的指针!函数执行完毕时,将释放分配给局部对象的存储空间。此时对局部对象的引用就会指向不确定的内存!返回指向局部对象的指针也是一样的,当函数结束时,局部对象被释放,返回的指针就变成了不再存在的对象的悬垂指针。
关于临时对象5:返回非引用类型,存在临时对象这个概念。
- 函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。
- 在求解表达式的时候,如果需要一个地方存储其运算结果,编译器会创建一个没命名的对象,这就是临时对象。C++程序员通常用temporary这个术语来代替temporary object。用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。
- 当函数返回非引用类型时,其返回值既可以是局部对象,也可以是求解表达式的结果。
题外话6:
main函数允许没有返回值就可结束,编译器会自动为其默认返回0。将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。
代码分析7:(注意看注释)
#include <iostream>
using namespace std;
int val()
{
int i = 1 ;
return i ;
}
int& ref()
{
int j = 3 ;
int &i = j ; // comment it will also compile.
return j ; // 不能返回局部对象的引用,可以将int j = 3 ;放在全局作用域。
// 但是编译器不会报错,只是设计思想有问题,请注意main函数中Attention 1和Attention 2的结果。
}
int main()
{
int vv = val();
//Sconst int& rv = val(); // 编译器报错,error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
// const int& rv = val(); can compile
int vr = ref() ; // Attention 1,编译器不会报错。
int& rr = ref() ; // Attention 2
cout << vv << endl ;
//cout << rv << endl ;
cout << vr << endl ;
cout << rr << endl ;
return 0;
}
运行结果1:
运行结果2:
参考博文:http://blog.csdn.net/keyouan2008/article/details/5741917
http://chinaxxren.iteye.com/blog/1547449
相关博文:关于C++引用的分析