本讲定位:四级最高频、最容易丢分的一讲。2026 年 3 月四级真题中,第 4 题(三种参数传递)、第 5 题(作用域与
::)连着两道单选直接考本讲内容,共 4 分;编程题里函数的使用更是无处不在。对应官方大纲:四级知识块 4「函数」——函数的定义、调用、声明(不包含匿名函数、类的括号运算符重载);形参、实参;全局作用域、局部作用域;值传递、引用传递。以及知识块 1「指针」中的指针传递。
前置知识:三级的循环、分支、一维数组、函数的初步使用。
代码说明:本讲所有代码均已用 g++ 11.5(
-std=c++11)编译运行验证,输出结果即为文中标注结果。
先看 2026 年 3 月四级真题第 4 题(原题):
void fun(int a, int &b, int *c){
a += 1;
b += 2;
*c += 3;
}
int main(){
int x = 1, y = 1, z = 1;
fun(x, y, &z);
cout << x << " " << y << " " << z;
}
输出是什么?
选项是 A. 2 3 4、B. 1 3 4、C. 2 1 4、D. 1 1 1。
这一道题把三种参数传递方式塞进了同一个函数——a 是值传递、b 是引用传递、c 是指针传递。学生只要有一种没搞清楚,这 2 分就没了。
答案:B(
1 3 4)。
a 是值传递,a += 1 改的是副本,x 纹丝不动 → 1b 是引用传递,b 就是 y 的别名,b += 2 直接改 y → 3c 是指针传递,c 存着 z 的地址,*c += 3 通过地址改 z → 4这道题就是本讲的教学大纲。 把它彻底讲透,四级函数部分的分就稳了。
#include<iostream>
using namespace std;
int add(int a, int b); // ① 声明(declaration):只说"有这么个函数",以分号结尾
int main() {
cout << add(3, 4) << endl; // ③ 调用(call):真正用它
return 0;
}
int add(int a, int b) { // ② 定义(definition):写出函数体
return a + b;
}
| 有函数体吗 | 结尾 | 能出现几次 | |
|---|---|---|---|
| 声明 | ❌ 没有 | ; |
可以多次 |
| 定义 | ✅ 有 { } |
} |
只能一次 |
| 调用 | — | — | 任意多次 |
为什么需要声明? C++ 是从上往下读代码的。main 里调用 add 时,编译器必须已经”见过” add。两种办法:
add 的定义整个搬到 main 前面(小程序常用);⚠️ 常考陷阱:把定义写在
main后面又不写声明,编译报错'add' was not declared in this scope。选择题喜欢考”下列程序能否通过编译”。