C++基础——函数篇
📌 一、函数声明与定义
🔹 函数声明(Function Declaration / Prototype)
告诉编译器“某个函数存在”,但不提供实现
int add(int a, int b); // 仅声明
🔸 通常写在头文件 .h
中
🔸 多个源文件使用函数时,声明是必须的
🔹 函数定义(Function Definition)
提供完整实现体
{}
int add(int a, int b) {
return a + b;
}
🔸 通常写在 .cpp
源文件中
📌 二、函数签名(Function Signature)
函数签名 = 函数名 + 参数类型(不包括返回类型)
int sum(int a, int b); // 签名为:sum(int, int)
float sum(float x, float y); // 签名不同:sum(float, float)
📌 C++ 支持函数重载:多个同名函数,只要签名不同即可。
📌 三、参数传递方式
1. 按值传递(Pass by Value)
void foo(int x); // 拷贝副本,原始变量不变
2. 按引用传递(Pass by Reference)
void foo(int& x); // 可修改原变量
3. 按指针传递(Pass by Pointer)
void passByPointer(int* x) {
*x = 100; //类似传引用,也能修改原始变量。
}
4. 常量引用传递(避免拷贝 + 保证只读)
void foo(const std::string& s);
5. 右值引用(用于移动语义)
void foo(std::string&& s); // 可“偷”s的资源
📌 四、默认参数 & 函数重载
void greet(std::string name = "Guest"); //形参name不传入实参时,默认值取Guest;有默认值的形参可不传入实参
void print(int x);
void print(double x); // 函数重载
📌 五、内联函数(inline
)
建议编译器在调用处展开函数体(不是强制),会在预处理阶段进行函数内联。
inline int square(int x) {
return x * x;
}
- 适用于短小频繁调用的函数
- 编译器不一定遵守 inline 建议
📌 六、函数指针 & 回调函数
🔹 函数指针
- 函数也是一种对象,可以通过指针来引用和调用。
声明函数指针
int add(int a, int b) {
return a + b;
}
int (*funcPtr)(int, int) = add;
调用函数指针
std::cout << funcPtr(3, 4); // 输出:7
🔹 回调函数(Callback)
把函数作为参数传递,也可以使用lambda表达式传入函数指针作为参数
void doWork(int x, int y, int(*callback)(int, int)) {
std::cout << "Result: " << callback(x, y) << std::endl;
}
int multiply(int a, int b) { return a * b; }
int main() {
doWork(3, 4, multiply); // 传入回调函数
}
📌 七、Lambda 表达式(现代 C++ 回调替代)
匿名函数对象,常用于 STL 和并发编程
C++11 引入的特性,可以写出轻量、匿名、就地定义的函数。
基本语法
auto func = [](int a, int b) {
return a + b;
};
std::cout << func(3, 4); // 输出:7
捕获外部变量
int x = 10;
auto lambda = [x](int y) { return x + y; }; // 捕获x的值
引用捕获与值捕获
int a = 1, b = 2;
auto f = [=]() { return a + b; }; // 值捕获
auto g = [&]() { a = 3; return a + b; }; // 引用捕获
用作回调函数
void process(int x, const std::function<int(int)>& func) {
std::cout << "Lambda callback: " << func(x) << std::endl;
}
int main() {
process(10, [](int val) { return val * 2; }); // 输出:Lambda callback: 20
}
📌 八、函数模板(泛型函数)
template<typename T>
T max(T a, T b) {
return a > b ? a : b;
}
支持任意类型(只要支持 >
运算符)
📌 九、函数返回值优化(RVO)和 std::move
Buffer getBuffer() {
Buffer b;
return b; // 编译器会优化掉拷贝(返回值优化)
}
✅ 总结
术语 | 作用 |
---|---|
函数声明 | 向编译器声明函数存在 |
函数定义 | 提供函数具体实现 |
函数签名 | 函数名 + 参数类型(不含返回值) |
参数传递 | 支持值、引用、const 引用、右值引用 |
函数指针 | 可将函数作为参数传递或赋值 |
回调函数 | 传入函数用于异步处理或事件处理 |
Lambda 表达式 | 匿名回调/闭包式函数,现代 C++ 首选 |
函数模板 | 泛型函数,支持任意类型处理 |