C++入门学习:函数篇
逻辑
main()函数
程序的执行从main()函数开始,调用了其他函数后程序控制流程会返回到main()函数,在main()函数中结束整个程序运行。main()函数可以出现在程序的任何位置,每个程序有且仅有一个main()函数。
联系
程序所有函数都是平行定义的,在一个函数内部不允许定义另外的函数。函数可以相互调用,但是不能调用main()函数。main()函数的主要作用是调用各个函数,相当于总调度。
分类
标准库函数(结合头文件使用)
自定义函数
函数声明
格式
返回值的数据类型 函数名(数据类型 变量名1,数据类型 变量名2,……);
说明:“数据类型 变量名1,数据类型 变量名2,……”称为形参列表
//变量名可以省略,但数据类型不能省略
//有返回值
double area(double a,int b);
char* strcpy(char*,const char*);
//无返回值
void abort();
函数定义
格式
返回值的数据类型 函数名(形参列表)
//此处形参名不能省略
{
//若干实现算法的语句,称为函数体
[return 语句;]
}
说明
①返回值
有返回值:必须有return 语句;
无返回值:类型为void,为 “ return;”或者无return 语句;
②形参列表
有形参的形参列表为(类型 形参1,类型 形参2,……)
无形参的形参列表为( )。
③return
只能返回一个值,当函数体内代码执行到return语句时,函数立刻结束。
④注意
函数体内不能包含另一个函数的定义,但可以声明其他函数。
函数调用
(函数不带默认形参值)
格式
函数名(实参1,实参2,……)
函数名()
说明
1.实参可为常量、变量或其他构造类型数据及表达式,实参必须有确定的值
2.实参个数必须和形参个数相同(带有默认值的形参例外),且数据类型相匹配
方式
// 函数表达式
result=factorial(m);
cout<<factorial(m)<<endl;
//函数语句
abort();
//函数实参
cout<<max(max(a,b),c)<<endl;
函数使用流程
方式一
先定义,后调用,可省略声明
方式二
先调用,后定义,必须在调用前声明
以求三个数中最大的数为例
int Max(int a, int b, int c)
{
int MAX = 0;
if (a > b) MAX = a;
if (c > a) MAX = c;
return MAX;
}
int main( )
{
int l,m,n;
cin>>l>>m>>n;
int MAXMIUM=0;
MAXMIUM=Max(l,m,n);
cout<<"最大值为"<<MAXMIUM<<endl;
return 0;
}
或者
int Max(int a,int b,int c);
int main()
{
int l,m,n;
cin>>l>>m>>n;
int MAXMIUM=0;
MAXMIUM=Max(l,m,n);
cout<<"最大值为"<<MAXMIUM<<endl;
return 0;
}
int Max(int a, int b, int c)
{
int MAX = 0;
if (a > b) MAX = a;
if (c > a) MAX = c;
return MAX;
}
带默认形参值的函数
设置形参的默认值,调用时如果给出实参,则采用实参值,否则采用预先给出的默认值。
//实参与形参的传递顺序为从左至右,故指定默认值的参数必须放在形参最右端,否则出错
void fun(double a,int b=0,int c,char d='a');//错误
void fun(double a,int c,int b=0,char d='a');//正确
//若函数定义在调用之前,须在函数定义中给出默认值
void fun(double a,int c,int b=0,char d='a')
{ ……;}
int main()
{ ……
fun(10.2,5);
……}
//若函数定义在函数调用之后,则函数声明中必须给出默认值,而函数定义时不能再给出默认值,即使默认值相同也不可以
void fun(double a,int c,int b=0,char d='a');
int main()
{ ……
fun(10.2,5);
……}
void fun(double a,int c,int b,char d);
{ ……;}
函数重载
相同函数名,不同参数列表。
//函数声明
int sum(int a,int b);
int sum(int a,int b,int c);
double sum(double a,double b,double c);
//不能以形参名不同构成重载,不能以返回值类型不同构成重载
int sum(int a,int b);//错误
double sum(int x,int y);//错误、
函数参数传递
值传递
一般用于不需要修改实参的值
//以求三角形面积为例
double Square(double a, double b, double c)
{
double s = 0, p = (a + b + c) / 2;
double k = p * (p - a) * (p - b) * (p - c);
s = sqrt(k);
return s;
}
int main()
{
double l,m,n;
cin>>l>>m>>n;
double S=0;
S=Square(l,m,n);
cout<<"三角形面积为"<<S<<endl;
system("pause");
return 0;
}
指针传递
一般用于要修改实参的值 或者 返回值不止一个
//以输入一个学生两门课程成绩为例
void input(double*ma,double*en)
{
cout<<"请输入Math及English成绩";
cin>>*ma>>*en;
}
void output(double ma,double en)
{
cout<<"数学成绩="<<ma<<endl;
cout<<"英语成绩="<<en<<endl;
}
int main()
{
double math,english;
input(&math,&english);
output(math,english);
return 0;
}
引用传递
//以交换两个数据为例
void swapData(int&,int&);
int main()
{
int x,y;
cin>>x>>y;
cout<<"main x="<<x<<",y="<<y<<endl;
swapData(x,y);
cout<<"main x="<<x<<",y="<<y<<endl;
return 0;
}
void swapData(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
数组参数
数组元素作为函数的实参
参考值传递
数组名作为函数的实参
地址传递,即把实参数组的首地址赋予形参数组名,形参数组名取得该首地址后与实参数组为同一数组,共同拥有一段内存空间,编译系统不再为形参数组分配内存
//以排序一个数组内的值为例
void sort(int* brr)
{
int temp = 0;
for (int i = 0; i < 8; i++)
for (int j = 0; j < 7; j++)
{
if (brr[j] > brr[j + 1])
{
temp = brr[j];
brr[j] = brr[j + 1];
brr[j + 1] = temp;
}
}
return;//此语句可加可不加
}
int main()
{
int arr[8] = { 49,38,65,97,76,43,27,49 };
sort(arr);
for (int j = 0; j < 8; j++)
cout << arr[j] << endl;
return 0;
}
说明
//函数声明,注意一维形参数组不用指明数组长度
double average(double [],int);
//用指针方式声明
double average(double* ,int);
//特别注意二维形参数组不能缺省第二维的长度
double average(double[][3]);
double avg=average(arr);//调用函数,实参是数组名