C++ 函数(建议收藏)

C++ 函数:代码的积木与指挥家

在学习 C++ 的过程中,你可能会遇到这样一个问题:随着程序变大,代码变得越来越难读、难改,甚至一改就出错。这时候,你真正需要的不是更复杂的语法,而是一种结构化的思维方式——函数。C++ 函数就像是程序中的“积木块”:每个积木都有特定功能,你只需要把它们拼接起来,就能搭建出复杂的系统。函数不仅是代码复用的核心,更是程序可维护性的基石。

想象一下,你正在设计一个计算器程序。如果把所有加减乘除的逻辑都写在一个 main 函数里,代码会迅速膨胀成一团乱麻。但如果你把“加法运算”单独封装成一个函数,以后无论在哪用,只要调用它就行。这种“分而治之”的思想,正是 C++ 函数的价值所在。


函数的基本语法与结构

C++ 函数的定义遵循固定的语法模板。它的核心组成包括返回类型、函数名、参数列表和函数体。

// 返回类型为 int,函数名为 add,接收两个 int 类型参数
int add(int a, int b) {
    // 函数体:执行具体逻辑
    int result = a + b;
    return result;  // 将计算结果返回给调用者
}

我们来拆解这段代码:

  • int:表示该函数的返回值类型。函数执行完毕后会返回一个整数。
  • add:函数的名称,是调用它的“名字”。就像你叫朋友“小明”,函数也有自己的名字。
  • (int a, int b):参数列表。a 和 b 是两个整数类型的输入参数,函数内部可以通过它们进行计算。
  • { ... }:函数体,包含具体要执行的代码逻辑。
  • return result;:将计算结果返回给调用者。没有 return 语句的函数,返回类型必须是 void。

💡 提示:函数名建议使用小驼峰命名法(如 addNumber),避免使用中文或特殊字符,保证可读性。


函数的调用与参数传递

函数定义好了,接下来就是调用它。调用函数时,你需要提供对应的参数值。

#include <iostream>
using namespace std;

int add(int a, int b) {
    int result = a + b;
    return result;
}

int main() {
    int x = 5;
    int y = 3;
    
    // 调用 add 函数,传入 x 和 y 的值
    int sum = add(x, y);
    
    cout << "5 + 3 = " << sum << endl;
    
    return 0;
}

输出结果为:

5 + 3 = 8

这里的关键是“参数传递”机制。C++ 中默认采用值传递(pass by value),即函数会复制参数的值。这意味着:

  • 原始变量的值不会被修改。
  • 函数内部对参数的修改,不会影响外部变量。

例如:

void modifyValue(int num) {
    num = 100;  // 只修改了副本,不影响外面的变量
}

int main() {
    int a = 10;
    modifyValue(a);
    cout << a << endl;  // 输出仍然是 10,不是 100
    return 0;
}

如果你想让函数修改原始变量,就需要使用引用传递(pass by reference):

void modifyValue(int& num) {  // & 表示引用
    num = 100;  // 直接修改原变量
}

int main() {
    int a = 10;
    modifyValue(a);
    cout << a << endl;  // 输出 100
    return 0;
}

引用传递就像你把家里的钥匙交给朋友,他用钥匙开门,你家的门就开了——他操作的是“真实钥匙”,不是复印件。


函数重载:同一个名字,多种用法

C++ 支持函数重载(function overloading),即多个函数可以使用相同的名称,但参数列表不同。编译器会根据调用时传入的参数类型和数量,自动选择最匹配的函数。

// 重载版本 1:两个整数相加
int add(int a, int b) {
    return a + b;
}

// 重载版本 2:两个浮点数相加
double add(double a, double b) {
    return a + b;
}

// 重载版本 3:三个整数相加
int add(int a, int b, int c) {
    return a + b + c;
}

int main() {
    cout << add(2, 3) << endl;        // 调用 int 版本
    cout << add(2.5, 3.7) << endl;    // 调用 double 版本
    cout << add(1, 2, 3) << endl;     // 调用三参数版本
    return 0;
}

输出:

5
6.2
6

函数重载让代码更简洁。比如你写一个 print 函数,可以支持打印整数、字符串、浮点数,只需定义多个同名函数,调用时自动匹配。


默认参数与可变参数

C++ 允许为函数参数设置默认值,这样调用时可以省略部分参数。

void greet(string name, string greeting = "Hello", int times = 1) {
    for (int i = 0; i < times; i++) {
        cout << greeting << ", " << name << "!" << endl;
    }
}

int main() {
    greet("Alice");                    // 使用默认值:Hello, Alice!
    greet("Bob", "Hi");                // 使用自定义 greeting,times 默认为 1
    greet("Charlie", "Welcome", 3);    // 全部自定义
    return 0;
}

输出:

Hello, Alice!
Hi, Bob!
Welcome, Charlie!
Welcome, Charlie!
Welcome, Charlie!

⚠️ 注意:默认参数必须从右往左定义,不能中间跳过。例如 greet(string name, int times = 1, string greeting = "Hello") 是合法的,但 greet(string name, string greeting = "Hello", int times) 会报错。

对于参数数量不确定的情况,C++ 提供了可变参数函数(variadic functions),但推荐使用 initializer_list 或模板方式更安全。


函数的返回值与 void 类型

函数的返回值类型决定了它能“带出”什么结果。如果函数不需要返回值,就使用 void

void printMessage() {
    cout << "这是一个无返回值的函数" << endl;
}

int getValue() {
    return 42;
}

int main() {
    printMessage();  // 调用 void 函数,无需接收返回值
    int value = getValue();  // 接收 int 返回值
    cout << "获取的值是: " << value << endl;
    return 0;
}

✅ 重要提醒:void 函数不能用在表达式中。比如 cout << getValue(); 是合法的,但 int x = printMessage(); 会报错。


实际应用:编写一个简单的成绩管理系统

让我们用 C++ 函数来构建一个小型成绩管理模块,展示函数如何组织复杂逻辑。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// 函数 1:输入学生成绩
void inputScores(vector<double>& scores) {
    double score;
    cout << "请输入学生成绩(输入 -1 结束):" << endl;
    while (cin >> score && score != -1) {
        scores.push_back(score);
    }
}

// 函数 2:计算平均分
double calculateAverage(const vector<double>& scores) {
    if (scores.empty()) return 0.0;
    double sum = 0;
    for (double s : scores) {
        sum += s;
    }
    return sum / scores.size();
}

// 函数 3:显示成绩统计
void displayStats(const vector<double>& scores, double avg) {
    cout << "共输入 " << scores.size() << " 个成绩" << endl;
    cout << "平均分: " << avg << endl;
    cout << "最高分: " << *max_element(scores.begin(), scores.end()) << endl;
    cout << "最低分: " << *min_element(scores.begin(), scores.end()) << endl;
}

int main() {
    vector<double> studentScores;
    
    inputScores(studentScores);           // 输入成绩
    double average = calculateAverage(studentScores);  // 计算平均
    displayStats(studentScores, average); // 显示结果
    
    return 0;
}

这个例子展示了函数在真实项目中的作用:

  • 每个函数职责单一(输入、计算、展示)。
  • 通过参数传递数据,避免全局变量。
  • 使用 const 修饰只读参数,提升安全性。

总结与建议

C++ 函数是构建健壮、可维护程序的基础。通过合理使用函数,你可以:

  • 将复杂问题分解为小任务。
  • 避免重复代码,提升开发效率。
  • 提高代码可读性与可测试性。

记住:一个好函数,应该只做一件事,并且做好这件事。不要让一个函数既计算又输出,既读文件又写数据库。

从今天起,把函数当作你写代码的“工具箱”。每当你写一段重复逻辑时,问问自己:“能不能封装成一个函数?” 这种思维一旦养成,你的代码质量将显著提升。

C++ 函数,不只是语法,更是一种编程哲学。掌握它,你就离“写出好代码”更近了一步。