【return 语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。
return 有两种形式:
return;
return expression;
】
6.3.1 无返回值函数
【
没有返回值的return 语句只能用在返回类型是void 的函数中。
返回void 的函数不要求非得有return 语句,因为这类函数的最后一句后面会隐式的执行return。】
【一个返回类型是void 的函数也能使用return 语句的第二种形式,不过此时return 语句的expression 必须是另一个返回void 的函数。
强行令void 函数返回其他类型的表达式将产生编译错误。】
6.3.2 有返回值函数
【
只要函数的返回值不是void,则该函数内的每条return 语句必须返回一个值。
允许main 函数没有return 语句直接结束。如果控制到达了main 函数的结尾处而且没有return 语句,编译器将隐式地插入一条返回0 的return 语句。
return 语句返回值的类型必须与函数的返回类型相同,或者能隐式的转换成函数的返回类型。】
【在复杂的控制流中,有可能不经过任何return 语句就结束了函数的执行,而且
编译器常常检查不出此类错误。】
【返回一个值的方式和初始化一个变量或形参的方式完全一样:
返回的值用于初始化调用点的一个临时量(初始化该临时量时,局部对象还未被销毁),该临时量就是函数调用的结果。】
【不要返回局部对象的引用或指针;
但是如果该局部对象是外部对象的引用则可以,总之应该从底层考虑返回值绑定的对象在函数结束之后是否存在。】
【
调用一个返回引用的函数得到左值,其它返回类型得到右值。】
【main 函数的返回值可以看做是状态指示器,所以main 函数的返回类型也是有意义的。】
【在递归函数中,一定有某条路径是不包含递归调用的;否则函数将“永远”递归下去。】
6.3.3 返回数组指针
【因为数组不能被拷贝,所以函数不能返回数组。不过函数可以返回数组的指针或引用,这种函数的返回类型比较难写,
使用类型别名可以简化这一任务。】
【要想在声明返回数组指针的函数时不使用类型别名,函数应该如此声明:
Type (*function(parameter_list)) [dimension]
int (*func(int i)) [10]
】
【使用尾置返回类型:
C++11 新标准中还有一种可以简化上述声明的方法,使用尾置返回类型。
任何函数的定义都能使用尾置返回,但是这种形式对于返回类型比较复杂的函数最有效。
auto func(int i) -> int(*)[10]
尾置返回类型跟在形参列表后面并以一个-> 符号开头,为了表示函数真正的返回类型跟在形参列表之后,我们在本应该出现返回类型的地方放置一个auto。】
【使用decltype:
还有一种情况,如果我们确定函数返回的指针将指向哪种数组(通常直接使用返回的那个数组),就可以使用decltype 关键字声明返回类型。
int odd[] = {1, 3, 5, 7, 9};
int even[] = {0, 2, 4, 6, 8};
decltype(odd) *arrptr(int i)
{
return (i % 2) ? &odd : &even;
}
条件运算符在很多情况下可以代替if 条件语句。】