【入门级-C++程序设计:9、函数与递归-函数定义与调用、形参与实参】
一、函数定义与调用
- 函数定义
函数定义包括以下部分:
返回值类型 函数名(参数列表) {
// 函数体(逻辑代码)
return 返回值; // 如果返回值类型非 void
}
关键组成部分:
返回值类型:函数返回的数据类型(如 int、double、void 表示无返回值)。
函数名:标识函数的名称(遵循命名规则,如不能以数字开头)。
参数列表:输入参数(可选),格式为 类型 参数名,多个参数用逗号分隔。
函数体:包含具体执行的代码。
return 语句:返回结果(void 函数可省略或写 return;)。
举例说明:
// 计算两数之和
int add(int a, int b) {
return a + b;
}
// 无返回值的函数
void printHello() {
cout << “Hello, World!”;
}
- 函数调用
通过函数名和实际参数(若有)来调用函数:
函数名(实参列表);
调用方式:
直接调用:忽略返回值(仅对 void 函数或不需要返回值时)。
printHello(); // 输出:Hello, World!
赋值调用:将返回值赋给变量。
int result = add(3, 5); // result = 8
表达式调用:在表达式中使用返回值。
cout << add(2, add(3, 4)); // 输出:9
二、形参与实参
在C++中,形参(形式参数)和实参(实际参数)是函数调用时传递数据的两个关键概念,它们的区别和联系如下:
1、 形参(Formal Parameter)
定义:函数定义时声明的参数,用于接收调用时传递的值。
作用:规定函数需要的数据类型和数量,是函数内部的局部变量。
生命周期:函数调用时创建,函数结束时销毁。
举例说明:
void printSum(int a, int b) { // a 和 b 是形参
cout << a + b;
}
2、 实参(Actual Parameter)
定义:函数调用时传入的具体值或变量。
作用:为形参提供实际数据,可以是常量、变量或表达式。
关键要求:实参的类型和数量必须与形参匹配(或可隐式转换)。
举例说明:
int x = 5, y = 10;
printSum(x, y); // x 和 y 是实参
printSum(3, 7); // 3 和 7 是实参(常量)
printSum(x+1, y); // x+1 是表达式作为实参
3、 参数传递的三种方式
(1)值传递(Pass by Value)
特点:实参的值被拷贝给形参,函数内修改形参不影响实参。
举例说明:
void change(int num) { num = 100; } // 形参 num 是实参的副本
int main() {
int a = 10;
change(a); // 实参 a 的值(10)拷贝给形参 num
cout << a; // 输出 10(a 未被修改)
}
(2)引用传递(Pass by Reference)
特点:形参是实参的别名,函数内修改形参直接影响实参。
语法:在形参前加 &。
举例说明:
void change(int &num) { num = 100; } // num 是实参的引用
int main() {
int a = 10;
change(a); // num 直接绑定到 a
cout << a; // 输出 100(a 被修改)
}
(3)指针传递(Pass by Pointer)
特点:传递实参的地址,通过指针间接修改实参。
语法:形参为指针类型(类型*),调用时需取地址(&)。
举例说明:
void change(int *num) { *num = 100; } // num 是指向实参的指针
int main() {
int a = 10;
change(&a); // 传递 a 的地址
cout << a; // 输出 100(a 被修改)
}
4、常见问题与注意事项
类型匹配:实参类型必须与形参兼容(或可隐式转换)。
void func(double x) {}
func(5); // OK:int 隐式转 double
默认实参:C++允许形参设置默认值(需从右向左连续定义)。
void greet(string name, string msg = “Hello”) {
cout << msg << ", " << name;
}
greet(“Alice”); // 输出:Hello, Alice
函数重载:形参列表不同可定义同名函数。
int max(int a, int b);
double max(double a, double b);
常量形参:用 const 防止意外修改(尤其用于引用或指针)。
void print(const string &s) {
// s 不能被修改
}