C++语言入门_05
蓝桥云课学习记录打卡 2022/02/18
前言
在 C++ 中,函数是一组给定名称的语句。每个 C++ 程序都必须有一个主函数 main(),它是程序执行的起点。一个 C++ 程序由一个主函数和若干子函数组成。
- 函数的定义
- 函数的声明与调用
- 参数传递
- 默认参数
- 函数重载
一、函数的定义
C++ 中的函数分为 C++ 标准库函数
和自定义函数
。使用标准库函数需要包含特定的头文件,比如使用 vector 功能时,需包含头文件#include<vector>
。而自定义函数是用户自定义命名和声明的一组语句,其基本结构为:
type name(parameter list){
code
}
其中 type 为函数的返回值类型;name 为函数的名称,也是调用函数所使用的标识符;parameter list 为传递给函数的参数列表;code 为函数的主体,存放函数需要执行的语句。例如我们定义一个 add 函数:
int add(int a,int b){
return a + b;
}
add 函数的功能是利用 return 关键字返回 a 加 b 的和。
二、函数的声明与调用
函数的声明
如果希望在定义函数前调用函数,则需要在调用函数前声明函数,其结构为:
type name(parameter list);
其中 type 为函数的返回值类型;name 为函数的名称;parameter list 为传递给函数的参数列表。例如上例的 add 函数,如果要在定义 add 函数前调用 add 函数,则需要在调用此函数前,对函数进行声明:
int add(int a,int b); //函数声明。
int main(){
调用 add 函数 //在未定义函数前调用函数。
}
int add(int a,int b){
return a + b;
} //定义函数
函数的调用
调用函数时,需暂停主调函数的执行,转入执行被调函数,当被调函数执行至 return 语句或函数末尾时,被调函数执行完毕,转回执行主调函数。可按如下格式调用函数:
函数名(实参列表)
注意:实参列表应与函数原型的参数个数及参数类型一致。
新建 addhs.cpp 文件,输入:
#include <iostream>
using namespace std;
int add(int a,int b); //函数声明。
int main()
{
int x,y;
cout<<"input x y:"; //输出提示信息。
cin>>x>>y; //通过输入的方式给 x y 赋值。
int c=add(x,y);//在未定义函数前调用函数。将函数的返回结果赋给变量 c。
cout<<c<<endl;//输出 c 值。
return 0;
}
int add(int a,int b)
{
return a + b;
}//定义函数
执行语句 int c=add(a,b) 时,暂停执行 int main() 函数,转入执行 add 函数。把用户输入的 x、y 值传给 add 函数的变量 a、b,最后将语句 return a + b; 的结果赋给变量 c。
输入 x 值 和 y 值时,中间使用空格分隔,程序结果如下:
input x y :3 4
7
三、参数传递
在定义函数时,参数是没有实际值的,只起一个占位作用,所以称为形式参数,简称 “形参”;在调用函数时,参数必须有一个确定的值,是真正能对结果起作用的因素,所以称为实际参数,简称 “实参”。函数的 参数传递 指的是形参与实参结合的过程,其基本方式包括值传递
和引用传递
两种。
注意:形式参数的本质和局部变量相似,在进入函数的时候创建,退出函数的时候销毁。
值传递
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。例如新建 swapxy.cpp,输入:
#include<iostream>
using namespace std;
void swap(int a,int b){ //定义空函数 swap,用于交换 a 和 b 的值。
int t=a; //定义中间变量 t,并将 a 的值赋给变量 t。
a=b; //将 b 的值赋给 a。
b=t; //将 t 的值赋给 b,又因为 t=a,所以把 a 的值赋给 b。
}
int main(){
int x=3;
int y=4;
cout<<"x="<<x<<","<<"y="<<y<<endl; //输出 x、y。
swap(x,y); // 调用 swap 函数。
cout<<"x="<<x<<","<<"y="<<y<<endl; //输出调用函数后 x、y 的值。
}
主函数中第一句 cout<<“x=”<<x<<","<<“y=”<<y<<endl; 用于正常输出局部变量 x 和 y 的值。执行语句 swap(x,y); 调用已经定义好的函数 swap,但函数调用时传递的是实参的值,即单向传递过程,此时改变形参的值对实参无任何影响。
程序结果:
x=3,y=4
x=3,y=4
引用传递
使用引用传递,需要在定义函数时,在参数前加上符号 &,该方法把参数的引用复制给形式参数,修改形式参数会影响实际参数。例如修改 swapxy.cpp 文件为以下内容:
#include<iostream>
using namespace std;
void swap(int &a,int &b){ //定义空函数 swap,用于交换 a 和 b 的值。
int t=a; //定义中间变量 t,并将 a 的值赋给变量 t。
a=b; //将 b 的值赋给 a。
b=t; //将 t 的值赋给 b,又因为 t=a,所以把 a 的值赋给 b。
}
int main(){
int x=3;
int y=4;
cout<<"x="<<x<<","<<"y="<<y<<endl; //输出 x、y。
swap(x,y); // 调用 swap 函数。
cout<<"x="<<x<<","<<"y="<<y<<endl; //输出调用函数后 x 和 y 的值。
}
函数 swap 的形参属于引用类型,所以修改形参将影响实参。
程序结果:
x=3,y=4
x=4,y=3
默认参数
在 C++ 中,函数可定义具有默认值的参数,即 默认参数。当调用函数时,如果用户指定了参数值,则使用用户指定的值;如果参数值缺省,则使用默认参数。例如新建 defaultcs.cpp,输入:
#include<iostream>
using namespace std;
int add(int a,int b = 5){//变量 b 的值默认为 5。
return a + b;
}
int main()
{
int a,b;
cout<<"input a b:"<<endl;
cin>>a>>b;
cout<<"a + b(default) = "<<add(a)<<endl; //此时调用的 add 函数将 b 的值缺省,使之为默认参数。
cout<<"a + b = "<<add(a,b)<<endl;
return 0;
}
add(a) 的返回结果为:输入的 a 值与默认 b 值之和。
add(a,b) 的返回结果为:输入的 a 值与输入的 b 值之和。
程序结果:
input a b:
2 3
a + b(default) = 7
a + b = 5
函数重载
函数重载指定义一个参数类型或参数个数不同的重名函数。当程序执行时,编译器将调用参数类型与函数形参类型一致的函数。例如新建 renamehs.cpp,输入:
#include<iostream>
using namespace std;
int add(int a,int b){ //定义整型函数 add。
int c;
c = a - b;
return c;
}
double add(double a,double b){ //定义双精度型函数 add。
double c;
c = a + b;
return c;
}
int main()
{//函数重载。
cout<<"a + b = "<<add(3,4)<<endl;//调用整型函数 add。
cout<<"a + b = "<<add(3.111,4.222)<<endl;//调用双精度型函数 add。
}
执行 add(3,4) 时,调用 int add(int a,int b) 函数。
执行 add(3.111,4.222) 时,调用 double add(double a,double b) 函数。
程序结果:
a + b = -1
a + b = 7.333
挑战
请编写一个 C++ 程序:
自定义减法函数 subtra(int a,int b),并在主函数中调用此函数,返回 subtra(9,5) 的结果。
程序:
#include<iostream>
using namespace std;
int subtra(int a,int b){
int c;
c=a-b;
return c;
}
int main(){
cout<<"a - b ="<<subtra(9,5)<<endl;
}
结果
a - b = 4