函数把一组语句命名后供重复调用:参数接收输入,返回值或引用形参把结果交给调用方。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相应头文件。 - 自定义函数:由程序员编写,可按有无参数、有无返回值组合使用。
#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 返回。下一节介绍函数重载:同名函数以不同参数列表共存。