GESP 四级 第 01 讲:函数、作用域与参数传递

本讲定位:四级最高频、最容易丢分的一讲。2026 年 3 月四级真题中,第 4 题(三种参数传递)、第 5 题(作用域与 ::)连着两道单选直接考本讲内容,共 4 分;编程题里函数的使用更是无处不在。

对应官方大纲:四级知识块 4「函数」——函数的定义、调用、声明(不包含匿名函数、类的括号运算符重载);形参、实参;全局作用域、局部作用域;值传递、引用传递。以及知识块 1「指针」中的指针传递。

前置知识:三级的循环、分支、一维数组、函数的初步使用。

代码说明:本讲所有代码均已用 g++ 11.5(-std=c++11)编译运行验证,输出结果即为文中标注结果。


1. 为什么这一讲要放在第一位

先看 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 4B. 1 3 4C. 2 1 4D. 1 1 1

这一道题把三种参数传递方式塞进了同一个函数——a 是值传递、b 是引用传递、c 是指针传递。学生只要有一种没搞清楚,这 2 分就没了。

答案:B(1 3 4

这道题就是本讲的教学大纲。 把它彻底讲透,四级函数部分的分就稳了。


2. 函数的三件事:声明、定义、调用

2.1 三者的区别

#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。两种办法:

  1. add定义整个搬到 main 前面(小程序常用);
  2. 在前面放一句声明,定义写在后面(大程序标准做法)。

⚠️ 常考陷阱:把定义写在 main 后面又不写声明,编译报错 'add' was not declared in this scope。选择题喜欢考”下列程序能否通过编译”。