回头再看C++【第八天】

函数

函数是指一段在一起的、可以做某一件事儿的程序。也叫做子程序、(OOP中)方法。
一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能。使用时不需要关心模块内功能的实现,只需要清楚各个接口的使用就行。

函数基础

函数的定义就是对函数的说明描述,包括接口和函数体两部分。接口说明函数应该如何使用,通常包括函数名、参数和返回值;而函数体则是函数的主体部分,负责实现函数的具体功能
函数是语句序列的封装体,函数的定义由以下四个部分:类型说明符、函数名、参数表、函数体

<类型说明符> <函数名>(<参数表>){
    <函数体>
}

类型说明符指出函数的类型,即函数返回值的类型。没有返回值时,其类型说明符为void。参数表由0个、1个或多个参数组成。如果没有参数称为无参函数,反之称为有参函数。在定义函数时,参数表内给出的参数需要指出其类型和参数名。函数体由说明语句和执行语句组成,以实现函数的功能。应当注意,C++不允许函数的嵌套定义。
同变量一样,函数也可通过在定义时在前使用static关键字来限制其使用范围

static 类型标识符 函数名(形参表)

称为内部函数或静态函数,只能被同一文件中的语句或函数调用。
类似的,也可用extern关键字将函数定义为外部函数,使其能被其他文件调用;定义函数时会默认为外部函数,在需要调用此函数的文件中用extern声明即可使用。
内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句;而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度。内联函数一般在类体外定义,声明部分在类体内,并使用了一个inline关键字。
说明在类体内,定义在类体外的成员函数叫外联函数,外联函数的函数体在类的实现部分。对外联函数的调用会在调用点生成一个调用指令,函数本身不会被放在调用者的函数体内,所以代码减小,但效率较低。

函数的参数

形参和实参可以简单的理解为作用域分别在函数内和主函数的两个参数,他们的作用是进行数据传送。

  • 实参在使用时必须具有确定的值
  • 形参和实参的数量、类型和顺序应当严格一致
  • 函数调用中发生的数据传送是单向的,形参的值的变化不会引起实参的变化(按地址和按引用传递参数也是一样,因为传递的参数实际上是“地址”而非变量,能够改变地址指向的变量但不能改变地址实参的值,由此可以理解数组参数的传递)
//数组传参实例
typedef int shuzu[ 8]; 
int sum_ shuzu( shuzu &arr, int n) { 
    int sum = 0; 
    for( int i= 0; i < n; i++) {
    sum += arr [i]; //累加 
    } 
    return sum; 
} 
int main( int argc, char* argv[]) { 
    shuzu a; for( int i= 0; i< 10; i++) { 
    a[ i]= i;
    } 
    cout<< sum_ shuzu( a, 8)<< endl; 
    return 0;
}

在上述代码中,因为函数sum_shuzu的形参是数组,所以实参传递的是数组首地址而不是数组的值。

返回值和返回语句

将函数处理运算得出的结果返回给调用函数的上一层代码,就需要返回语句。

return 表达式;
return (表达式);

return的值的类型必须和函数定义时的类型相同,void类型的函数无返回值,但也需要return语句结束函数。
在一个函数中可以有多个return语句,但每次调用只能有一个return语句被执行。建议在函数的最后一行根据函数的功能写上return语句,无论是否需要,保证修改函数后程序不会陷入混乱。

调用函数

单独调用不需要使用函数的返回值,只需要函数里功能的执行。
函数表达式则需要使用函数的返回值。
当把函数作为另一个函数调用的实际参数使用,就是把该函数的返回值作为实参进行传递。

函数递归

一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
一个正确的递归函数包括循环体和递归出口,我们把函数反复调用自身的过程称为递推的过程,而每个函数的返回称之为回推。

指向函数的指针

函数本身不是变量,但是可以定义指向函数的指针,即函数指针。这种指针可以被赋值并 存放于数组中,传递给函数及作为函数的返回值等。函数的名字代表函数的入口地址,用 于存放一个函数的入口地址,指向一个函数。通过函数指针,可以调用函数,这与通过函数名直接调用函数是相同的。

数据类型 (*指针变量名) (函数形参表);

数据类型说明了该指针指向函数的返回值类型。函数指针定义后,可指向函数类型相同(定义类型和形参表相同)的不同函数。
使用时需给函数指针赋值

函数指针名 = 函数名;
//函数指针实例
int (*p)(int,int);
int sum(int a, int b){
    return a+b;
}
int main(){
    p = sum;
    cout << p(2, 3) << endl; //输出为5。
    return 0;
}

函数main()和命令行处理

所有C++程序中都会有一个main()函数,main()已经在系统中声明了,在程序中只需直接定义即可。函数main()永远不会在程序中 被调用,系统运行后将首先调用函数main()。函数main()也可以带2个参数,一个是整型参数,另一个是指向字符型的指针数组。函数main()的完整格式如下。

int main(int argc, char* argv[])

argc和argv两个变量表示的是存储当前文件路径的字符数组
其他内容可以看argc argv

补充一点

  • 寄存器变量存放在CPU的寄存器中,在使用时不需要访问内存,而直接从寄存器中读写,这样可提高执行效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量,及循环体内反复使用的变量均可定义为寄存器变量。
  • 当函数的参数个数较多时,可以用typedef来定义一个函数指针类型,对函数的参数进行简化
  • 添加了const关键字的函数的返回值不可修改,比如运算时不能使用自增自减运算符
  • 同一个类的对象共享一个成员函数的地址空间,而每个对象有独立的成员变量地址空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值