- return语句中之当前正在执行的函数,并将控制权返回到调用该函数的地方
无返回值函数
- 没有返回值的return语句只能用在返回类型是void的函数中,返回void的函数不要求非得有return语句,因为这类函数最后一句后面会吟诗执行return
- void函数可以使用return语句提前退出函数
有返回值函数
- return语句返回值类型必须与函数哦返回类型相同,或者可以隐式转换成函数返回值类型
- 在含有return语句哦循环后面应该也有一条return语句,如果没有的话,该程序就是错误的
值是如何被返回的
- 返回一个值的阿飞那个是和初始化一个变量或形参的方式一样:返回值用于初始化调用点的一个临时量,该临时量就是函数调用的结果
- 函数返回局部变量时的初始化
string make_plural(size ctr,constr string &word){
return(ctr>1)?word+ending:eord;
}
- 该函数返回类型是string,意味着返回值将被拷贝到调用点。该函数将返回word的一个副本或者一个未命名的临时变量string对象,该对象内容是word和ending的和
- 如果函数返回引用,则该引用仅仅是它所引对象的一个别名,如果形参和返回类型都是const string 的引用,不管调用函数还是返回结果都不会真正拷贝string对象
const string &shorterString(const string &s2, const string &s2){
return s1.size() <= s2.size()? s1:s2;
}
不要返回局部对象的引用或指针
- 函数完成后它所占用的存储空间也随之被释放掉了。因此函数终止意味着局部变量的引用将不在指有效的内存区域
返回类类型的函数和调用运算符
引用返回左值
- 函数的返回类型据决定函数调用是否是左值
- 调用一个返回引用的函数得到左值,其他返回类型得到右值
主函数main的返回值
- 我们允许main函数没有return语句直接结束,如果控制到达了main函数的结尾处而没有return语句,编译器将隐式插入一条返回0的return语句
- main函数返回值可以看成状态指示器,返回0代表执行成功,其他值代表失败,非0值具体含义根据机器而定。
递归
- 如果一个函数调用了自身,称该函数为递归函数
- 递归函数中必须有某条路径是不包含递归调用的
返回数组指针
- 数组不能被拷贝,函数不能返回数组
- 函数可以返回数组的指针或引用
- 定义别名的方式返回
typedef int arrT[10];
using arrT = int[10];
arrT* func(int i);
声明一个返回数组指针的函数
- 在声明func时不使用类型别名,我们必须了哦及被定义名字后面数组的维度
int arr[10];
int *p1[10];
int (*p2)[10] = &arr;
- 和上面声明一样,如果想定义一个返回数组指针的函数,则数组的维度必须跟在函数名字之后。
- 函数形参列表也跟在函数名字后面且形参列表应该先于数组的维度
- 返回数组指针的函数形式如下:
Type (*function ( parameter_list ) ) [dimension]
使用尾置返回类型
- 尾置返回类型跟在形参列表后面并以一个->符号开头
- 在本应该出现返回类型的地方放置一个auto
auto func(int i) -> int(*)[10];
使用decltype
- 如果我们知道函数返回的指针将指向那个数组,可以使用decltyor关键字声明返回类型
int odd[] = {1,3,5,7,9};
int even[] = {2,4,6,8};
decltype(odd) *arrPtr(int){
return (i%2)? &odd:&even;
}