掌握 C++ 函数:从基础到进阶的完整实战指南
C++ 函数完全指南
系统掌握 C++ 函数核心:用户自定义函数、声明与定义、参数传递、返回值、函数原型、标准库函数,附实战示例与最佳实践。
函数是完成特定任务的自包含代码块。将复杂问题拆解为小函数,提升可读性、可维护性、可测试性。
C++ 函数两大类:
- 标准库函数:语言预定义(如
sqrt()、abs()) - 用户自定义函数:开发者编写封装业务逻辑
本文聚焦用户自定义函数。
用户自定义函数
函数声明语法
返回类型 函数名(参数1, 参数2, ...) {
// 函数体
}
示例:void Greet() 打印问候。空参数列表表示无参。
void Greet() {
cout << "Hello World";
}
- 函数名:
Greet() - 返回类型:
void(无返回值) - 参数:无
- 函数体:
{}内代码
调用函数
在需要处直接写函数名加括号:
int main() {
Greet();
}

示例 1:显示文本
#include <iostream>
using namespace std;
void Greet() {
cout << "Hello there!";
}
int main() {
Greet();
return 0;
}
输出
Hello there!
函数参数
参数是函数接收外部数据的占位符。
void PrintNum(int num) {
cout << num;
}
调用时传入实参:
int main() {
int n = 7;
PrintNum(n);
return 0;
}
示例 2:多参数函数
#include <iostream>
using namespace std;
void DisplayNum(int n1, float n2) {
cout << "The int number is " << n1;
cout << "The double number is " << n2;
}
int main() {
int num1 = 5;
double num2 = 5.5;
DisplayNum(num1, num2);
return 0;
}
输出
The int number is 5 The double number is 5.5
实参类型必须与形参匹配(或可隐式转换)。

返回值与 return 语句
函数可返回值:指定返回类型,用 return 送出结果。
int Add(int a, int b) {
return a + b;
}
调用并接收返回值:
int sum = Add(100, 78);
cout << "100 + 78 = " << sum << endl;
示例 3:两数求和
#include <iostream>
using namespace std;
int Add(int a, int b) {
return a + b;
}
int main() {
int sum = Add(100, 78);
cout << "100 + 78 = " << sum << endl;
return 0;
}
输出
100 + 78 = 178
函数原型(前向声明)
函数定义在调用之后时,需在调用前提供原型告知编译器签名。
// 原型声明
void Add(int, int);
int main() {
Add(5, 3);
return 0;
}
// 定义在后
void Add(int a, int b) {
cout << (a + b);
}
原型语法:
返回类型 函数名(参数类型1, 参数类型2, ...);
示例 4:使用原型
#include <iostream>
using namespace std;
int Add(int, int); // 原型
int main() {
int sum = Add(100, 78);
cout << "100 + 78 = " << sum << endl;
return 0;
}
int Add(int a, int b) { // 定义
return a + b;
}
输出
100 + 78 = 178
用户自定义函数的四大收益
- 封装性:相关逻辑聚合为单一可复用单元
- 可读性:将复杂逻辑拆解为语义清晰的函数调用
- 可维护性:修改逻辑只需改一处,不波及调用点
- 可测试性:单元测试可隔离验证单个函数
标准库函数
C++ 标准库提供海量现成函数,简化常见任务。如 sqrt()、abs()、isdigit()。
使用需包含对应头文件。数学函数需 #include <cmath>。
示例 5:计算平方根
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double number = 25.0;
double squareRoot = sqrt(number);
cout << "Square root of " << number << " = " << squareRoot;
return 0;
}
输出
Square root of 25 = 5
sqrt() 声明在 cmath,故必须包含该头文件。
深入参考:C++ 标准库头文件参考
现代 C++ 函数进阶特性(C++11/14/17/20)
| 特性 | 版本 | 核心价值 |
|---|---|---|
| Lambda 表达式 | C++11 | 就地定义匿名函数对象,配合 STL 算法极其强大 |
auto 返回类型推导 | C++14 | auto Add(auto a, auto b) { return a + b; } |
| 泛型 Lambda | C++14 | [](auto a, auto b) { return a + b; } |
constexpr 函数 | C++11/14/20 | 编译期计算,用于常量表达式上下文 |
| 折叠表达式 | C++17 | 参数包展开:(args + ...) |
| 概念约束模板函数 | C++20 | template<Integral T> T Add(T a, T b) |
| 协程 | C++20 | co_await/co_yield 异步/生成器 |
函数设计最佳实践
- 单一职责:一个函数只做一件事,函数名动词短语表达意图(
CalculateTax而非Process) - 参数少而精:>3 个参数考虑封装为结构体/类
- 优先按值传递小型类型:
int、double、小结构体按值传;大对象用const T& - 避免输出参数:用返回值(C++17 结构化绑定
auto [x, y] = GetPos();)或std::optional/std::expected - 标记
noexcept:不抛异常的函数标记noexcept,启用优化 - 文档化契约:前置条件、后置条件、副作用、线程安全性
C语言
- Stratasys FDM打印优化必知:Insight软件10大核心功能
- 掌握 C++ 运算符:六大类型全解析与实战示例
- C++ 注释最佳实践:编写可读、可维护代码的注释艺术
- C++数组传递给函数实战指南
- C++ 友元函数与友元类:突破访问控制的利器
- C++ 运算符重载实战指南:语法、方法、限制与代码示例
- C 语言函数详解:定义、声明、调用与参数传递
- C++重载机制深度解析:函数重载与运算符重载全攻略
- C++多态实战指南:虚函数、动态绑定与纯虚函数
- 掌握Verilog函数:高效RTL设计的复用利器
- MATLAB 函数详解:定义、工作区、输入输出与多种函数类型
- 精通 Python Lambda 函数:实用示例与最佳实践