学习了C++的数据类型和控制语句,现在学习函数。
通常情况下,我们将相对独立的,经常使用的功能抽象为函数。函数编写好以后,可以被重复使用。
从上面我们可以看出,使用函数有利于代码重用,提高效率。
函数的定义 | 类型标识符 函数名(形式参数表) { 语句 } | 类型标识符规定了函数的类型,也就是函数返回值的类型,有return语句给出,无返回值的函数类型标识符为void,不必写return语句 |
函数的声明 | 调用之前,首先要在主调函数中声明函数原型,形式如下: 类型说明符 被调函数名(含类型的形参表) | |
函数的调用 | 声明后,可以按照以下格式调用: 函数名 (实际参数表) | 函数的调用,可以作为一条语句,这时,函数可以没有返回值 函数的调用出现在表达式中,这时就必须有一个明确的返回值 |
注意 | 如果是在所有函数之前声明了函数,则在程序任何地方都可以调用。 如果是在主调函数内部声明,则只在这个函数内部有效。 |
例:编写一个求x的n次方的函数。
算法,x的n次方,就是n个x相乘,用迭代法应该就OK乐。
程序如下:
#include
double power(double x,int n);/*此句是声明要调用的函数*/
void main(void)
{double x,int n;
cout<<"请输入x,n的值"<
cin>>x>>n;
cout<
}
/* 下面是函数power的定义*/
double power(double x,int n)
{double val=1.0;
int i;
for(i=1;i<=n;i++)
val=x*val;
return(val);
}
此处的函数power(doubel x,int n)就是定义的一个函数。可以被调用。函数要有一个返回值,因为函数被调用时作为一个表达式出现的。必须有返回值。
感觉写程序就是做数学题。
函数调用 | 说明 | |
函数的嵌套调用 | 函数允许嵌套调用,就是函数1调用函数2,函数2调用函数3 | |
函数的递归调用 | 函数可以调用自身,称为递归调用 | 对应递归的算法 递归的算法是一种递推的算法,颇有些福尔摩斯的味道, |
函数的参数传递 | ||
内联函数 | 为了节省开销,在编译时,将函数体嵌入每一个调用语句处, 一般不能有循环,和switch语句 其实,应该就是简单的替换而已,就是为了省去调用和现场保护的时间和开销 | 语法: inline 类型说明符 被调函数名(含类型说明的形参表) |
函数重载 | 重载这种机制,也是为了减少代码量,编译器会根据实参的类型和个数来查找匹配的函数。 C++支持取相同的函数名,但是形参不同, |
函数的嵌套调用
例:输入两个整数,求他们的平方和。
算法:为了说明问题,设计两个函数,fun1,用来求平方和,fun2,用来求平方。
程序如下:
#include
void main(void)
{int a,b;
int fun1(int x,int y);
cin>>a>>b;
cout<<"a,b的平方和:"<
}
/*定义fun1*/
int fun1(int x,int y)
{int fun2(int m);/*声明fun2*/
return(fun2(x)+fun2(y));/*调用fun2*/
}
/*定义fun2*/
int fun2(int m)
{return(m*m);/*返回m的平方*/
}
在fun1函数中,调用fun2函数。就是函数的嵌套调用。
函数的递归调用
例:求n!。
算法:n!就是n*(n-1)*(n-2)…*1.要求5!,就要先求4!,要求4!的阶乘,就要先求3!要求3!就要先求2!要求2!就要先求1!1!=1。然后往回推回去。用循环语句实现的一个算法。
程序如下:
#include
long fac(int n)/*定义一个函数fac*/
{long f;
if(n<0) cout<<"你输入的数据错误"<
if(n==0) f=1
if(n>0) f=fac(n-a)*n;/*递归的部分*/
return(f);
}
就是这么一个过程,加入n=4,就一直执行到n=0,是个已知的值,然后往回代,就能求出4!的值。
函数的参数传递
有两种,一种是传值,一种是传引用。我们上面的都是传值。
传值 | 用实参来初始化形参 初始化完成后,无论形参怎样变化,也不影响实参 | |
传引用 | 对形参的修改,对实参也有效 | 先不管了,用到再看啦 |
C++的系统函数
应该是提高效率的最佳办法,调用系统函数。这就要熟悉常用的系统函数。
看下火影,该吃饭了。