详解函数的返回值类型和return语句

版权声明:小能 https://blog.csdn.net/qq_43152052/article/details/88379572

返回类型和return语句

return语句的功能就是终止当前程序的函数,返回调用函数的地方。

语法形式:return;或者return expression;

无返回值类型

没有返回值的return语句只能返回类型是void函数。返回void的函数不要求非得有return语句,编译器会在void函数的最后一句加上一个return语句。

可以使用return语句,在void函数中提前退出。与在迭代语句中使用break语句一样,退出迭代。

使用return expression的话,expression必须返回的是一个void的函数,强行令void函数返回其他类型的表达式将产生错误。

有返回值函数

只要函数的返回类型不是void,则return语句必须返回一个值。返回的值要么与函数的返回类型相同,要么能进行隐式地转换为函数的返回类型。

虽然C++无法确定结果的正确性,但是可以保证每个return语句的结果类型相同

含有return语句的循环后面也应该有一条return语句,如果没有的话该程序就是错误的。并且编译器很难发现这个错误。

1、值是如何被返回的:

函数的返回值是用于初始化调用点的一个临时量的,该临时量就是函数调用的结果。

如果函数的形参和返回类型都是引用类型的话,则无论是调用函数还是返回结果都不会真正拷贝对象。

2、不要返回局部对象的引用或指针:

函数调用完成,函数体内的局部变量的内存被释放了,因为局部变量的生命期仅存在于函数的作用域。如果返回值的类型为引用或指针的话,该局部变量消失,调用函数得到的引用绑定的对象不再存在,即引用无效,或者调用函数得到的指针也将指向一个不存在的对象

解决方法:引用所引的是函数开始之前就存在的对象,则该引用有效,比如引用的是实参,实参定义在main函数中。指针与引用类似,需指向函数前已存在的值才有效,比如指向的是实参。

3、返回类类型的函数和调用运算符:

函数调用运算符:点运算符和箭头运算符。二者的优先级相同,且都满足左结合率。

4、引用返回左值:

函数的返回类型得到的是左值,即调用该函数时,该函数出现在=的左侧,右值用来初始化。其实也很好理解,引用一般是作为左值进而修改所绑定对象的值的。

左值:用的是对象的身份(对象在内存中的位置) 右值:用的是对象的值(内容)

函数的返回类型决定于函数调用是否使用左值。如果调用的函数返回类型是引用,则这个引用的函数得到左值,其他类型得到右值。

普通引用返回类型可以给调用函数点赋值,因为对象的别名可以进行赋值操作。

常量引用不能给调用函数点赋值,因为它已经和实参绑定了,由于它的常量性质,所以就不能在改变了。

5、列表初始化返回值:

C++11新标准规定,函数可以返回花括号包围起来的列表。此处的列表也用来对函数返回的临时两进行初始化。如果列表为空,临时量则执行值初始化(int类型为初始化0,string类型初始化为空字符串),否则,返回的值由函数的返回类型决定。

如果函数返回的是内置类型,则花括号包围起来的列表最多包含一个值,并且该值所占的空间不应该大于目标类型的空间。如果函数返回的是类类型,由函数本身定义初始值如何使用。

6、主函数main的返回值:

main函数可以没有return语句就直接结束。如果控制到达了main函数的结尾处并且没有return语句时,编译器将隐型地加入return 0这个语句。

头文件cstdlib定义了两个预处理变量来表示函数成功和失败,EXIT_FAILURE和EXIT_SUCCESS

由于这两个是预处理变量,所以不需要前面加上std::,也不能在using声明中

递归:函数直接或间接的调用了它自身。main函数不能调用它自己。

的是函数开始之前就已经存在的对象,则该引用有效;如果引用的是局部变量,则随着函数的结束局部变量也失效了,此时返回的引用无效。

当不希望返回的对象被修改时,返回对常量的引用。

函数不能返回数组==。但是可以返回数组的指针或引用,从语法上来讲比较繁琐,最直接的方法是适用类型别名

typedef int arrT[10];//arrT是一个类型别名,表示的类型是含有10个整数的数组

using arrT=int [10];//arrT表示含10个整数的数组
arrT *func(int i);//func返回的是一个指向含有10个整数的数组的指针

声明一个返回数组指针的函数:

如果想定义一个返回数组指针的函数,则==数组的维度必须跟在函数的名字后面。==函数的形参列表也跟在函数的名字后面形参列表应该先于数组的维度

语法形式:Type (* function(parameter_list)) [dimension];

基本数据类型 (* 函数名(形参列表)) [数组的维度]

(* function(paramenter_list))两端的括号必须存在

int (*func(int i)) [10];

1:func(int i)表示调用func函数时需要一个int类型的实参

2:(* func(int i))表示我们可以对函数调用的结果执行解引用操作

3:(* func(int i)) [10]表示解引用func的调用将得到一个大小是10的数组

4:int (* func(int i)) [10]表示数组中的元素是int类型

使用尾置返回类型:

C++11新标准通过使用尾置返回类型来简化func声明。任何函数的定义都可以使用尾置返回,对于复杂的数组的指针与数组的引用,语法形式如下:

auto func(int i)->int(*) [10];//func接收一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组

使用decltype:

如果知道指针指向那个数组,则可以使用decltype关键字声明其返回类型。

decltype关键字得到的是数组类型int [],并不是指针类型,所以使用者需要手动加上*型号。

不需要实参调用func函数,(&func())表示函数返回的是一个引用,(&func()) [10]表示引用的对象是维度为10的数组,string (&func()) [10]表示数组的元素是string对象。

string (&func()) [10];

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/88379572
今日推荐