算法之路helloworld被隐藏了的过程iOS学习

函数详解

2016-08-24  本文已影响98人  b64c74899092

函数

基础

一个典型的函数(function)定义包括下面部分:

我们通过调用运算符来执行函数,调用运算符的形式是一对圆括号,它作用于一个表达式,该表达式是函数或者指向函数的指针,圆括号之内是一个用逗号隔开的实参列表,我们用实参初始化函数的形参。调用表达式的类型是就是函数的返回类型。


函数调用完成两项工作:


形参和实参


形参和函数体内部定义的变量统称为局部变量。局部变量的生命周期依赖于定义的方式。


函数声明:


分离式编译:也就是按照逻辑关系将程序分隔到几个文件中去,每个文件独立编译。如果修改了其中一个源文件,那么只需要重新编译那个修改了的文件。

参数传递

传引用参数:当形参是引用类型时,和其他引用一样,引用形参也是它绑定对象的别名,也就是说引用形参是它对应的实参的别名。通过引用形参可以允许函数改变一个或多个实参的值。


传值参数:当实参的值被拷贝给形参时,形参和实参是两个相互独立的对象。此时,对变量的改动不会影响初始值。传值参数的机理完全一样,函数对形参做的所有操作都不会影响到实参。


指针形参:指针的行为和其他非引用类型一样。当执行指针拷贝操作时,拷贝的是指针的值。拷贝之后,两个指针是不同的指针。因为指针可以间接的访问它所指的对象,所以通过指针可以修改它所指的对象的值。


使用引用形参返回额外的信息:一个函数只能返回一个值,但是有时候需要同时返回多个值,可以通过添加引用形参来返回额外的信息。


const形参和实参:

例:

int a=1;
const int * b=&a;  // 用非常量初始化一个底层const对象可以
int *c=b;  // 反过来不行 const int * 不能转换成 int *
int d=*b;  // 这样可以

数组形参:

数组的两个特殊性质对我们定义和使用作用在数组上的函数有影响:

数组是以指针的形式传递给函数的。所以函数无法知道数组的尺寸,管理数组的指针形参通常由下面三种方法:

传递多维数组:传递多维数组的时候,实际上是传递指向数组首元素的指针,我们处理的是多维数组,首元素本身就是一个数组,指针就是指向一个数组的指针。


含有可变形参的函数:

为了编写能够处理不同数量实参的函数,C++11新标准提供了两种主要的方法:

省略符:省略符形参是为了便于C++程序访问某些特殊的C代码而设置的,这些代码使用了名为 varargs 的C标准库功能。省略符只能出现在形参列表的最后一个位置。


返回类型和 return 语句

return 语句终止当前正在执行的函数并将控制权返回到调用该函数的地方。有两种形式:


无返回值函数:没有返回值的 return 只能用在返回类型是void的函数中,返回void的函数不要求非要有return语句,因为在这类函数结尾会隐式的执行return。如果void函数想在中间提前退出可以使用return语句。返回void的函数也可以使用第二种形式,不过expression必须是另一个返回void的函数。


有返回值函数:返回的类型必须和函数类型相同,或者可以隐式的转换。


值是如何被返回的:返回一个值的方式和初始化一个变量或形参的方式完全一样,返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果。


不要返回局部对象的指针或者引用:一旦函数返回,局部对象被释放,引用和指针都会失效。


引用返回左值:调用一个返回引用的函数得到左值,其他类型的得到右值。可以给非常量引用的函数赋值。


列表初始化返回值:如果返回值是内置类型,花括号包围的列表最多包含一个值;如果是非内置类型,则根据类的定义。


主函数返回值:主函数没有return直接结束,会隐式的插入return。返回0表示执行成功,非0表示失败。


递归函数:调用自身的函数称为递归函数,递归函数一定有某个路径是不包含递归的(终止条件),否则函数将无限递归下去直到栈空间被耗尽。


返回数组指针:数组不能被拷贝,所以不能返回数组,只能返回数组指针。可以使用类型别名来简化。


函数重载

同一作用域内几个函数名字相同但是形参列表不同,称为重载


调用重载函数有三种结果:


特殊用途语言特性

内联函数:将函数指定为内联函数,通常就是将它在每个调用点上内联的展开,相当于强化版的宏定义,内联函数省去了寻找函数入口地址的过程。一般来说,内联函数适用于规模较小(代码少)、流程直接(非递归)、频繁调用的函数。

上一篇下一篇

猜你喜欢

热点阅读