基础知识点
从形式上看,可以将函数分为有参函数、无参函数和空函数三大类。无参函数在调用时不需要给出参数,主调函数并不将数据传给被调用函数,一般不需要带回函数值,所以函数类型说明为void;有参函数在调用时则必须给出参数,主调函数要将数据传给被调函数,一般需要带回函数值;空函数即函数体只有一对花括号,花括号内没有任何语句的函数。
调用函数之前要先声明函数原型,形式如下:
类型说明符 被调函数名(含类型说明的形参表)
声明了函数原型之后,便可以按如下形式调用函数:
函数名(实参列表)
函数的调用又分为传值调用和传址调用,传值调用是将实参的数据值传递给形参,在被调用函数中,形参值可以改变,但不影响主调函数的实参值,参数传递方向只是从实参到形参,简称单向值传递。传址调用是将实参变量的地址值传递给形参,这时形参是指针,即让形参的指针指向实参地址,这是一种可以改变实参变量的值的方法。
定义在函数外部的变量称为全局变量,全局变量的作用域是从变量定义的位置开始到文件结束;而局部变量的作用域是在定义该变量的函数内部。
在正常语句中,&代表去地址;在说明语句,用&表示引用,*代表指针变量。
例子
1.定义无参函数的一般形式
类型名 函数名(【void】)
{
声明部分
执行语句
}
2.定义有参函数的一般形式
类型名 函数名(形式参数表列)
{
声明部分
执行部分
}
例如:
int max(int x,int y) //函数首部,函数值为整型,有两个整型参数
{
int z; //函数体中的声明部分
z=x>y?x:y; //将x和y中的大者的值赋给整型变量z
return (z); //将z的值作为函数值返回调用点
}
3.传值调用
#include<iostream>
using namespace std;
void swap(int a,int b)
{
int tmp=a;a=b;b=temp;
}
int main()
{
int c=1,d=2;
swap(c,d);
cout<<c<<' '<<d<<endl;
return 0;
} //程序输出为:1 2
在此例中,虽然在swap函数中交换了a,b两数的值,但是在main中却并没有交换。因为swap函数只是交换c,d两变量副本的值,实参值没有改变,并没有达到交换的目的。
4.传值调用
这种调用方式是将实参变量的地址值传递给形参,这时形参是指针,即让形参的指针指向实参地址,这里不再是将实参拷贝一个副本给形参,而是让形参直接指向实参,这就提供了一种可以改变实参变量的值的方法。现在用传址调用来实现swap:
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tmp=a;a=b;b=tmp;
}
int main()
{
int c=1,d=2;
swap(c,d);
cout<<c<<' '<<d<<endl;
return 0;
} //程序输出为:2 1
在此例中,因为swap函数的参数为传址调用,&a是指实参变量的地址值传递给形参,所以,在函数swap中修改a,b的值相当于在主函数main中修改c,d的值。
5.函数的递归调用
在调用一个函数的过程中有出现或间接地调用该函数本身,称为函数的递归调用。例如求解人年龄的问题:
int age(int n) //求年龄的递归函数
{
int c; //用c作为存放年龄的变量
if(n==1)
c=10; //当n=1时,年龄为10
else
c=age(n-1)+2; //当n>1时,此人的年龄是他前一个人的年龄加2
return c; //将年龄值带回主函数
}
学习感悟
函数的掌握是学习c++中十分重要的一部分,人们可以用定义不同的函数来解决各式各样的问题,甚至大多数问题都需要多个函数的调用来解决,有些还需要使用函数的嵌套和递归调用。所以在学习函数的过程中,首先要根据面对的问题的具体特点构想出合适的函数类型,要逐渐养成c++的思考方式,把自己的想法转换成相对应的程序。而这点恰恰是初学者能否熟练运用好自己所学知识的关键,如果不能正确高效的写出符合自己思想的代码,就不可能运用所学知识来解决问题。要解决上述问题,就只能通过多上机练习来使自己尽快适应。
函数的嵌套简单来说就是在一个函数中调用多个函数来完善自身功能,相当于用零件拼装成一个完整的机器。递归通常把一个大型的复杂问题一步步转化成较小的问题,然后在求解小问题后来向上反推出大问题的答案,因此就需要该函数在其内部不停地调用其自身,直到转化成可以求解的程度。在使用递归算法的时候,尤其要注意设置满足退出递归的条件,否则程序就会无限制地运行下去,造成错误。递归的次数应该是有限的,所以可以用if语句来控制,只有在满足某一条件时,才继续执行递归调用,否则就不再继续。
在调用函数的过程中,为了保证在函数中改变的值可以被主函数接受,不能直接把要改变值的变量作为实参,而应该使用指针变量作为函数实参。这是因为在调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。不能试图通过改变形参指针变量的值而使实参指针变量的值改变,但是地址的改变可以保留下来并被计算机所储存。