函数把一组语句命名后供重复调用:参数接收输入,返回值或引用形参把结果交给调用方。C++ 日常接口对只读大对象使用 const T&(如 const std::string&、const std::vector<int>&),标量仍可按值传递。本节说明声明与定义、值传递与引用传递的分工,并为重载打基础。

函数的特性

  • 除变参等进阶话题外,常见函数具有固定个数的形式参数(可含默认参数,见默认参数)。
  • 一次调用通常返回一个值;无返回值时返回类型为 void。
  • 标量与非引用形参默认按值传递:形参是实参的副本。若需修改调用方变量或避免大对象拷贝,应使用引用或指针。

声明、定义与调用

声明给出函数名、返回类型与参数列表,无函数体;定义包含完整实现。调用点之前编译器须见到声明。定义可放在调用之后,声明常置于头文件供多文件共享(见头文件与多文件)。

#include <iostream>

int add(int a, int b);  // 声明

int main() {
    std::cout << add(2, 3) << std::endl;  // 调用
    return 0;
}

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

调用形式为函数名加圆括号,实参类型须能匹配形参;匹配过程涉及类型转换与重载决议。

返回类型为 void

void 表示不向调用方返回数值。可使用不带表达式的 return; 提前结束函数。无参函数可写 void foo() 或 void foo(void);C++ 中空参数列表 () 表示无参,与 C 中“未指定参数”的古老写法不同。

#include <string>

void log_line(const std::string& msg) {
    if (msg.empty()) {
        return;
    }
    std::cout << msg << std::endl;
}

库函数与自定义函数

  • 标准库:如 std::sqrt(需 <cmath>)、std::getline(需 <string>)。使用前 #include 相应头文件。
  • 自定义函数:由程序员编写,可按有无参数、有无返回值组合使用。
C++ 函数:字符串引用与 vector运行
#include <iostream>
#include <string>
#include <vector>

int sum(const std::vector<int>& v) {  // const 引用:只读、不拷贝整个容器
    int s = 0;
    for (int x : v) {
        s += x;
    }
    return s;                         // 把和交给调用方
}

void greet(const std::string& name) {  // void:不返回值;const 引用避免拷贝字符串
    std::cout << "Hello, " << name << "\n";
}

int main() {
    greet("C++");                     // 字面量绑定到 const string&
    std::cout << sum({1, 2, 3, 4}) << "\n";  // {1,2,3,4} 生成临时 vector,传给 sum
    return 0;
}

函数体的组成部分

  • 返回类型:函数值的类型;无返回时为 void。
  • 函数名:标识符,命名规则与变量相同;同一作用域内重载须参数列表不同。
  • 参数列表:形参类型与名称;可带默认实参。
  • 函数体:花括号内的语句序列。

值传递

下列示例中,形参 x 是实参 n 的副本,函数内自增不影响 main 中的 n:

#include <iostream>

void bump_copy(int x) {
    ++x;
    std::cout << "inside: " << x << std::endl;
}

int main() {
    int n = 1;
    bump_copy(n);
    std::cout << "main: " << n << std::endl;
    return 0;
}
传递方式含义
按值形参为副本;修改形参不改变实参(标量、小对象)
引用传递形参绑定实参;可修改实参,大对象可避免拷贝
指针传递传递地址的副本;通过解引用访问原对象

多返回值与 main

标准模型下一次调用返回一个值。需要多个结果时可返回结构体、std::pair,或通过引用/指针形参写回。程序入口为 int main() 或带参数的 main;返回 0 通常表示成功,非零可表示错误码。标准允许在 main 末尾省略 return 0,教学示例仍建议显式写出。

调用与栈帧

每次调用通常在栈上分配栈帧,存放形参、返回地址与局部变量;返回后该帧回收。递归过深可能导致栈溢出,见递归。不同次调用的局部变量相互独立。

本节说明了函数声明、定义、值传递与 void 返回。下一节介绍函数重载:同名函数以不同参数列表共存。