一、函数定义
c++程序的典型结构:
第1部分:预处理指令
符号常量定义
函数声明
第2部分:主函数
第2部分:函数定义
函数定义的形式:
数据类型 函数名(形式参数表)
{函数体 //执行语句
}
注:1、数据类型是函数的返回值类型,若数据类型为void,则无返回值。
2、形式参数表可以是空的(即无参函数)。
3、函数不允许嵌套定义,但允许嵌套使用
函数的形式:从结构上分为三种:无参函数,有参函数和空函数
1、无参函数即为没有参数传递的函数,无参函数一般不需带回函数值,所以数据类型为void。
2、有参函数即有参数传递的函数,一般需带回函数值。
3、空函数即函数体只有一对花括号,花括号内没有任何语句的函数,在大型程序设计中,用于扩充函数功能。二、函数的声明与调用
函数的声明:
调用函数之前先要声明函数原型:类型说明符 被调函数名(含类型的形参表)
注:如果在所有函数定义之前声明了函数原型,那么在本程序文件中任何地方都可以调用该函数。如果是在某个主调函数内部声明了被调用函数原型,则该原型只在这个函数内部有效。
函数的调用:
声明了函数原型之后,便可按如下形式调用函数:
函数名(实参列表)
注:实参列表中应给出与函数原型形参个数相同、类型相符的实参,实参可以是常量、表达式,也可以是已有确定值的变量、数组或指针名。
函数的返回值:
返回语句 return:
return(表达式)
注:return语句的功能是把程序流程从被调函数转向主调函数并把表达式的值带回主函数,实现函数的返回。所以,在圆括号表达式的值实际上就是该函数的返回值。
返回语句的另一种形式是:
return;
这时函数没有返回值,而只把流程转向主调函数。三、函数的调用方式:
1、传值调用
这种调用方式是将实参的数据值传递给形参,即将实参值拷贝一个副本存放在被调用函数的栈区中。在被调用函数中,形参值可以改变,但不影响主调函数的实参值,参数传递方向只是从实参到形参,简称单向传递。
2、传引用
定义时在形参前加&,如int &a。这时实参和形参两个变量指向同一个对象,形参改变实参也会改变。3、传址调用(传地址)
这种调用方式是将实参变量的地址值传递给形参,这时形参是指针,即让形参的指针指向实参地址,这里不再是将实参拷贝一个副本给形参,而是让形参直接指向实参,这就提供
了一种可以改变实参变量的值的方法。
定义时在变量前加*,即为定义指针变量,如int *a,a即为指针变量。
在变量前加&,即取变量的地址,如&b,即为取变量b的地址,a=&b,即把指针变量a指向变量b。
指针变量前加 *,即取指针变量指向的目标变量的内容,如b= *a,即把指针变量a指向的目标变量的值赋予变量。四、全局变量、局部变量及他们的作用域
全局变量:定义在函数外部的变量称为全局变量,全局变量的作用域是从变量定义的位置开始到文件结束,可以在文件中位于全局变量定义后面的任何函数中使用。
局部变量:
1、局部变量的作用域是定义在该变量的函数内部,局部变量只在定义它的函数内有效。
2、在不同的函数中变量名可以相同,他们分别代表不同的对象,在内存中占据不同的内存单元,互不干扰。
3、一个局部变量和一个全局变量是可以重名的,在相同的作用域内局部变量有效时全局变量无效,即局部变量可以屏蔽全局变量。
4、在代码快中定义的变量的存在时间和作用域即将限制在该代码块中。
5、主函数main中定义的变量也是局部变量(与其他编程语言不同)。
6、全局变量数组初始全部为0,局部变量值是随机的,要初始化初值,局部变量受栈空间大小限制,大数组需要注意。局部变量的数组不能开很大,全局变量随意。
例题分析
1、使用函数实现求两个自然数的最大公约数
#include<iostream>
using namespace std;
int cf(int x,int y)
int main( )
{
int x, y, f;
cin>>x,y;
f = cf(x,y);
cout<<f<<endl;
return 0;
}
int cf(int x,int y)
{
int r,temp;
if (m < n)
{
temp = m; m = n; n = temp;
}
r = m % n;
while (r != 0)
{
m = n;
n = r;
r = m % n;
}
return n;
}
用辗转相除法求最大公约数。
2、传引用交换两变量的值
传引用:
#include<iostream>
using namespace std;
void swap( int &a, int &b)
{
int tmp;
tmp = a; a = b; b = tmp;
}
int main()
{
int n1,n2;
swap(n1,n2)
cout<<n1<<n2;
return 0;
}
使用传引用来交换变量的值。
3、输入a、b两个整数,按大小输出这两个数(传地址)
#include<iostream>
using namespace std;
swap(int x, int y)
{ int t;
t=x; x=y; y=t;
}
int main( )
{ int *point1, *point2, a,b;
cin>>a>>b;
point1=&a; point2=&b;
if (a<b)
swap (a, b);
cout<<“a=“<<a<<“,b=”<<b<<‘\n’;
cout<<*point1<<‘\t’<<*point2;
}
通过传地址对变量a、b排大小。
学习心得
对于函数,我们要先想这个函数能实现什么功能,然后再去考虑这个函数中我们要采用什么样的传值方式,最后再去考虑函数体的写法。说白了,函数就是把庞大冗长的主函数中分为很多个可读的小部分,让本来让人读起来很难过的主函数变得可读,增强了程序的可读性,并且易于发现程序的问题,我们调程序的时候可以通过函数一个一个的调用,来发现是哪个函数出现了问题,使我们的改错效率大大提升。