一、函数的概念
main 就是一个函数,它是 C++ 的主函数。一个 C++ 程序由一个主函数和若干子函数构成。程序从主函数开始执行,由主函数调用子函数,子函数还可以再调用其他子函数。一个函数既可以调用其他函数,又可以被其他函数调用。
二、函数的定义
语法形式
类型说明符 函数名(含类型说明的形式参数表)
{
语句序列
}
形式参数(简称形参)
形式参数表的一般形式:
type1 name1, type2 name2, ... , typen namen
- type1, type2, … , typen 是类型标识符,表示各形参的类型。
- name1, name2, … , namen 是形参名。
- 形参的主要作用是实现主函数和被调函数之间的联系。
- 形参可以为空,表示该函数不接受任何参数。
三、函数的组成部分
| 组成部分 | 说明 |
|---|---|
| 类型说明符 | 函数的返回值类型。如果函数不返回值,使用 void |
| 函数名 | 标识符,遵循变量命名规则,建议使用有意义的名称 |
| 形式参数表 | 用逗号分隔的参数列表,每个参数包含类型和名称。可以为空 |
| 语句序列 | 函数体,用大括号 {} 括起来,包含具体的执行代码 |
四、代码示例
以下代码演示了函数的定义和调用:
#include <iostream>
using namespace std;
// 示例1:无参数、无返回值的函数
void printHello()
{
cout << "Hello, World!" << endl;
}
// 示例2:有参数、无返回值的函数
void printSum(int a, int b)
{
cout << a << " + " << b << " = " << a + b << endl;
}
// 示例3:有参数、有返回值的函数
int add(int x, int y)
{
return x + y;
}
// 示例4:多个形参的函数
double calculateArea(double length, double width)
{
return length * width;
}
// 示例5:形参为空的等价写法
int getValue(void)
{
return 100;
}
// 示例6:函数可以调用其他函数
void printResult(int a, int b)
{
int sum = add(a, b); // 调用 add 函数
cout << "结果是:" << sum << endl;
}
// 示例7:求最大值
int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
// 示例8:判断素数
bool isPrime(int n)
{
if (n < 2)
return false;
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
return false;
}
return true;
}
int main()
{
// 调用无参数函数
printHello();
// 调用有参数函数
printSum(3, 5);
// 调用有返回值的函数
int result = add(10, 20);
cout << "add(10, 20) = " << result << endl;
// 调用计算面积函数
double area = calculateArea(5.5, 3.2);
cout << "面积 = " << area << endl;
// 调用形参为空的函数
int v = getValue();
cout << "getValue() = " << v << endl;
// 函数调用其他函数
printResult(7, 8);
// 调用求最大值函数
cout << "max(15, 9) = " << max(15, 9) << endl;
// 调用判断素数函数
int num = 17;
if (isPrime(num))
cout << num << " 是素数" << endl;
else
cout << num << " 不是素数" << endl;
return 0;
}Code language: PHP (php)
五、注意事项
- 函数必须先声明或定义,然后才能被调用。如果函数在 main 之后定义,需要在 main 之前提供函数声明(原型)。
- 函数的返回值类型必须与 return 语句返回的表达式类型一致。如果函数声明为 void,则不能使用带值的 return,但可以使用 return; 提前结束函数。
- 形参是函数内部的局部变量,函数调用时由实参初始化。形参的改变不会影响实参(值传递)。
- 形参名可以与全局变量或其他函数中的形参同名,因为它们作用域不同。
- 函数体内部可以定义局部变量,其作用域从定义处到函数体结束。
- 函数不能嵌套定义(即在一个函数内部定义另一个函数),但可以嵌套调用。
六、函数声明(函数原型)
如果函数定义在调用点之后,需要在调用前提供函数声明:
int add(int x, int y); // 函数声明(函数原型)
int main()
{
int r = add(1, 2); // 调用
return 0;
}
int add(int x, int y) // 函数定义
{
return x + y;
}Code language: JavaScript (javascript)
函数声明可以省略形参名,只保留类型:
int add(int, int);
但建议保留形参名,提高可读性。
七、常见错误
1. 函数未声明就调用
int main()
{
foo(); // 错误:foo 未声明
return 0;
}
void foo()
{
cout << "hello" << endl;
}Code language: JavaScript (javascript)
解决:在 main 之前添加声明 void foo();。
2. 返回值类型与 return 不匹配
int func()
{
return "hello"; // 错误:返回类型不匹配
}Code language: JavaScript (javascript)
3. void 函数使用 return 带值
void func()
{
return 0; // 错误:void 函数不能返回值
}Code language: JavaScript (javascript)
4. 形参和实参类型不匹配
void print(int x) { ... }
print(3.14); // 3.14 被截断为 3,可能丢失精度Code language: PHP (php)
Previous: 练习一下-枚举
Next: 函数的返回值和返回值类型