赞
踩
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作声明。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。