函数返回值分为:值,引用,指针三种。引用是c没有而c++有的,并且因为引用是左值实现了运算符连续运算的基础,而值和引用都不可以。下面我们就来看一下这三种返回方式的各自的特点:
1、返回值
int test1()
{
int a = 1;
retur a;
}
返回值是最简单有效的方式,他的操作主要在栈上,根据函数栈的特性局部变量a会在函数结束时被删除,为了返回a的值,需要产生a的复制。如果a原子类型这当然也无所谓,但是如果a是大的对像,那么对a的复制将会产生比较严重的资源和性能消耗。注意函数返回值本身因为没有名称或引用是右值,是不能直接操作的。
2、返回指针
int* test2()
{
int *b = new int();
*b = 2;
return b;
}
返回指针是在C中除了返回值以外的唯一方式,根据函数栈的特性也会产生复制,但是这个复制只是4(8)字节的指针,对于返回大型对像来说确实能够减少不少的资源消耗。但是返回指针资源的清理工作交给了调用者,这某种意义上违反了谁申请谁销毁的原则。指针也是右值同样无法操作。
3、返回引用
int& test2()
{
int *b = new int();
*b = 2;
return *b;
}
引用是C++中新添加的概念,所以返回引用也是C++中相对于C来说所没有的。引用是值的别名,和指针一样不存在对大对像本身的复制,只是引用别名的复制。引用是左值,返回引用可以直接操作,也就可以进行连续赋值,最经典的示例是拷贝构造函数和运算符重载一般返回引用。
test2()+=1;
但是,返回引用会带来一个问题,那就是返回局部变量内存空间,会产生异常,也就是说局部变量是不能作为引用返回的。局部指针可以作为引用返回但是和返回指针一样需要调用者自己去清理内存。