[TOC]

概述

文章参考:https://www.cnblogs.com/southcyy/p/10256378.html

文章参考:https://segmentfault.com/q/1010000005338630

函数返回值

1.函数返回基础数据类型

1
2
3
4
int test (){
int a=1;
return a;
}

​ 返回值时最简单的方式,它的操作主要在栈上,变量a在函数结束后会删除,为了返回a的值,系统会在内部建立一个临时变量保存a的值,以返回给调用该函数的表达式,调用结束后变量便不再存在。如果a是简单地数据类型也无所谓,不是很占用内存,如果a是大的自定义类型的数据,那么对a的复制将会占用比较大的内存。函数返回值是右值,不能进行运算符操作。

2.返回指针:

1
2
3
4
5
int *test2(){
int *b=new int();
*b=2;
return b;
}

​ 返回指针是在C中除了返回值以外的唯一方式,根据函数栈的特性,也会产生复制,只是复制的是一个指针即一个地址,对于返回大型对象可以减少不少的资源消耗。但返回指针的资源的清理交给了调用者,这违反了谁申请谁销毁的原则。指针也是右值同样无法操作。

3.返回引用:

1
2
3
4
5
int& test2(){
int *b=new();
*b=2;
return b;
}

​ 引用是值的别名,和指针一样不存在对大对象本身的复制,只是引用别名的复制。引用是左值,可以直接进行操作,也可以进行连续赋值,最经典的实例是拷贝构造函数与运算符重载一般都返回引用。

​ 需要注意的是局部变量不能作为引用返回。

  • C++中成员函数返回对象与返回引用
    • 返回对象与返回引用的区别:函数原型与函数头
      • Car run(const Car&)//返回对象
      • Car& run(const Car&)//返回引用
    • 返回对象涉及到生成对象的副本。因此返回对象的成本包括了调用复制构造函数来生成副本所需要的时间和调用析构函数删除副本所需要的时间。返回引用可以节省时间和内存。直接返回对象与函数直接return a返回值一样。都会生成临时副本。