写程序最怕的就是一段代码到处复制粘贴。函数就是用来解决这个问题的:把一段常用逻辑打包起来,起个名字,想用的时候喊一声就行。这篇文章带你把 C++ 函数的几个核心用法一次搞清楚。

定义并调用一个最简单的函数

一个函数由返回值类型、函数名、参数列表和函数体组成:

#include <iostream>
using namespace std;

void sayHello() {
    cout << "Hello, C++!" << endl;
}

int main() {
    sayHello();  // 输出:Hello, C++!
    sayHello();  // 再调用一次,就再输出一次
    return 0;
}

void 表示这个函数不返回任何值。函数定义好之后不会立刻执行,只有被调用时才会跑里面的代码。

带参数的函数

参数让函数变得灵活——同一套逻辑可以处理不同的数据:

#include <iostream>
using namespace std;

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

int main() {
    greet("小明", 2);
    // 输出:
    // 你好, 小明!
    // 你好, 小明!
    greet("小红", 1);  // 输出:你好, 小红!
    return 0;
}

调用时传的值叫实参,函数定义里的 name、times 叫形参。实参按位置一一对应传给形参。

有返回值的函数

想让函数算出一个结果交还给调用者,就给它定一个返回值类型:

#include <iostream>
using namespace std;

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

double circleArea(double r) {
    return 3.14159 * r * r;
}

int main() {
    int sum = add(3, 5);
    cout << sum << endl;             // 输出:8
    cout << circleArea(2.0) << endl; // 输出:12.5664
    return 0;
}

return 会立刻结束函数,并把后面的值送回去。返回值类型是 int,就返回一个整数;是 double 就返回小数,类型要对得上。

函数重载:同名不同活

C++ 允许多个函数共用一个名字,只要参数列表不一样,这叫函数重载:

#include <iostream>
using namespace std;

int maxValue(int a, int b) {
    return a > b ? a : b;
}

double maxValue(double a, double b) {
    return a > b ? a : b;
}

int main() {
    cout << maxValue(3, 7) << endl;     // 输出:7
    cout << maxValue(2.5, 1.8) << endl; // 输出:2.5
    return 0;
}

编译器会根据你传的实参类型自动挑合适的版本。注意:只有返回值类型不同、参数完全一样,不算重载,编译器会直接报错。

先声明后使用

如果把函数写在 main 后面,编译器读到调用处还不认识它。这时可以先给一个函数声明,也叫函数原型:

#include <iostream>
using namespace std;

int square(int x);  // 函数声明,末尾有分号

int main() {
    cout << square(5) << endl;  // 输出:25
    return 0;
}

int square(int x) {  // 函数定义可以放在后面
    return x * x;
}

小结

  • 函数把常用逻辑打包复用,void 表示不返回值
  • 形参在定义里占位,实参在调用时传入,按位置一一对应
  • return 结束函数并送回结果,返回类型要匹配
  • 参数列表不同的同名函数构成重载,编译器按实参类型挑版本
  • 函数定义放在调用之后时,记得先写声明

函数是组织代码的基本单元,把这篇吃透,后面学类、模板都会顺很多。