函数小结

1.什么是函数?

函数即功能,程序以程序文件为编译单位,一个程序文件可以包含若干函数,一个main函数,从main函数开始执行,调用其他函数,c++中除了main函数,其他函数多被封装在类中。实际应用中,main函数写得较简单,它的作用就是调用各个函数。常用的函数被放在函数库中。

2.函数分类:

1)从用户使用的角度

系统函数(库函数)和用户自己定义的函数(一般函数做到起名字要做到见名知义)

2)从函数的形式:

无参函数:调用时不必给出参数,用来执行固定操作,如输出字符串。

定义格式:void 函数名 (void) 其中括号里的void可省略;

有参函数:调用时要给出参数。实参传给函数定义处的形参,最终返回一个函数值(此值与形参无关)。实参可以是用户自己输入的,也可以在写程序时直接给出。有参函数可以没有返回值,此时函数类型为void;

3.未定义就使用函数,须有函数声明(函数原型)。格式:函数类型+函数名(参数类型,参数类型)

4.定义函数的参数名不能省略(区别函数声明),参数名在函数体里面要使用的。一般来说,函数体的第一行先把返回值定义好,在过程中对返回值进行赋值,函数体的最后一行再用return(单一出口原则)

5.函数声明要有分号

6.关于形参和实参的说明:形参不占内存存储单元,调用时分配内存单元,调用结束内存单元释放;实参可以是表达式,常量,变量;只能从实参向形参传递数据。实参与形参的个数一致,根据程序需要,确定需要从main传递多少个参数到函数进行运算。

7.return后的括号可以省略,return后可以是一个表达式(简练)

8.函数(实参)其实就是函数值

9.当函数值类型和return语句中表达式的值不一致,以函数类型为准

10.函数调用方式:

1)函数语句;

2)函数表达式 如c=max(a,b)*2;

3)函数参数:即函数调用作为另一个函数的实参

11.调用库函数#include <>

12.一般把main函数写在最前面,统揽全局;

13.函数的嵌套调用:定义一个函数的过程,调用另外的函数(注意要有函数声明)

14.函数的递归调用:

概念:包含递归调用的函数称为递归函数。递归调用应该是有限次数的,可以用if语句控制,只有在条件成立时才继续执性递归调用。递归包含回溯和递推。

例子:求n!

//求阶乘的函数

long fac(int n)

{long f;

if(n<0) f=-1;

else if(n==0||n==1) f=1;

else f=fac(n-1)*n;

return f;

}

*15.指定函数为内置函数 格式:声明的时候前面加上inline;作用:规模小但使用频繁的函数,节省程序运行时间

注:内置函数不能包括复杂的控制语句,如switch和循环

*16.函数的重载:对一个函数名重新赋予新的含义,使一个函数名可以多用;(重载即一物多用)

相同功能的函数,但细节不同,这时可以用函数重载;重载函数的参数个数,参数类型,参数顺序至少有一种不同,重载函数不要求函数体相同。

例子:求两个整数或3个整数中的最大数:

int max(int a,int b,int c)  //函数声明

int max(int a,int b)          //函数声明

int max(int a,int b,int c)   //定义

{if(b>a)  a=b;

if(c>a)   a=c;

return a;

}

int max(int a,int b)  //定义

{if(a>b) return a;

else return b;

}

原理:调用时系统根据参数个数找到与之匹配的函数

*17.函数模板

定义:建立一个通用函数,其函数类型和形参类型不确定,用一个虚拟的类型来代表。函数体相同的函数都可用此模板代替,只需在模板中定义一次即可。调用函数时,系统根据实参类型取代模板中的虚拟类型;

定义模板格式:

template<typename/class  T>    //模板声明,T为类型参数

T 函数名(T 参数名,T参数名,T 参数名)   //通用函数定义

{  函数体}

函数模板比函数重载更方便,但它只适用于函数体相同,参数个数相同而类型不同的情况。

*18.有默认参数的函数

给形参一个默认值(对形参初始化)格式:

int max(int a,int b,int c=0)

{函数体}

max(a,b) ;   //此时c默认取0;

注:指定默认值的参数要放在形参表列的最右端,若函数定义在函数调用之后,声明时给出默认值;一个函数不能既是重载函数,又作为有默认参数的函数。

19.以上带*的内容为c++中增加的,c中没有。

20.变量的作用域(空间角度)

局部变量:函数内部定义的,只在函数内部使用;main函数中定义的变量也只在主函数中有效,而不是在整个文件或程序中有效。不同函数可以使用同名的变量,互不干扰。形参也是局部变量。

全局变量:main函数和其他函数外面定义,作用范围是定义处至本源文件结束。它可以被同一文件的所有函数使用。建议一般不使用全局变量。

21.变量的存储类别

变量的属性:数据类型,作用域,存储类别

存储类别有4种:自动的auto 静态的static 寄存器的 register 外部的 extern 这几个关键字用于函数声明

存储方法:静态存储,动态存储

局部变量默认为自动变量(auto),动态分配存储空间,调用结束释放。声明为static 则为静态局部变量。对static变量只需赋值一次,static int a=0;缺点:多占内存。

什么情况下使用静态局部变量?

需要保留上一次函数调用结束时的值。比如:求1到5的阶乘

for(int i=1;i<6;i++)

cout<<"i!="<<fac(i)<<endl;

int fac(int n)

{ static long f=1;

f=f*n;  //每次在f原值的基础上乘n;

return f;
}

静态全局变量:希望外部变量只限于本文件引用(防止被其他文件误用)

不必用register声明变量,当今的编译器可以自动识别使用频繁的变量,自动将其放在CPU的寄存器中,故了解即可。

用extern声明外部变量

1)在一个文件声明全局变量:想在定义点之前的函数引用该变量,就用extern;(少用,因为我们一般在开头就定义全局变量,避免使用extern)

2)多文件程序声明外部变量:情况为程序由多文件组成时

做法:在任一个文件中定义该变量,在另一文件中用extern作声明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值