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++ 首选
函数模板 泛型函数,支持任意类型处理

posted @ 2025-05-19 16:48  江海余生  阅读(47)  评论(0)    收藏  举报