c++函数介绍(一)https://developer.aliyun.com/article/1437106
捕获方式详解
Lambda表达式的捕获列表定义了Lambda体内可以访问的外部变量。根据捕获方式的不同,这些变量可以按值捕获、按引用捕获或以其他方式捕获。
1. 按值捕获 [=]
- 行为:按值捕获时,Lambda表达式将外部变量捕获值捕获列表中,并且每个变量都是以其在Lambda创建时的值的副本捕获的。
- 特点:捕获的副本在Lambda体内是常量,除非在参数列表后面加上mutable关键字。
示例:
int x = 10; auto lambda = [=]() mutable { x = 42; }; // 'x' 是副本 lambda(); // 原始的 'x' 保持不变,仍为 10
2. 按引用捕获 [&]
- 行为:按引用捕获时,Lambda表达式将外部变量捕获值捕获列表中,并且变量是以引用的方式捕获的。
- 特点:Lambda体内对这些变量的任何修改都会影响到原始变量。
示例:
int x = 10; auto lambda = [&]() { x = 42; }; // 'x' 是引用 lambda(); // 原始的 'x' 现在变为 42
3. 显式捕获
- 行为:可以显式地按值或按引用捕获特定的变量。
- 示例:
int x = 10, y = 20; auto lambda = [x, &y]() { /* 使用 'x' 的副本和 'y' 的引用 */ };
4. 默认捕获与显式混合
- 行为:可以混合使用默认捕获方式(全部按值或全部按引用)与显式指定的方式。
- 示例:
int x = 10, y = 20; auto lambda = [=, &y]() { /* 按值捕获除 'y' 外的所有变量,'y' 通过引用捕获 */ }; auto lambda2 = [&, x]() { /* 按引用捕获除 'x' 外的所有变量,'x' 通过值捕获 */ };
5. 捕获 this 指针
- 行为:在类的成员方法中,可以捕获 this 指针来访问类的成员。
- 示例:
class Example { int value = 10; public: void method() { auto lambda = [this]() { return value; }; } };
使用场景和注意事项
- 使用场景:Lambda表达式非常适合用于需要临时函数对象的场景,如作为参数传递给算法,或者用于定义简单的回调函数等。
注意事项:
捕获列表中的变量可以按值([=]),按引用([&]),或者混合([=, &foo])捕获。
Lambda表达式的类型是唯一的,不可命名的。如果需要类型,可以使用 auto 关键字或 std::function。
在捕获外部变量时要注意生命周期问题,确保Lambda使用时,它所捕获的变量仍然有效。
函数模板
函数模板是C++中实现泛型编程的一种强大工具。它允许编写独立于特定数据类型的代码。这意味着可以用同一段代码来处理不同类型的数据,无需为每种数据类型编写重复的函数。
基本概念
泛型编程:函数模板是泛型编程的一部分。泛型编程的目标是使算法尽可能独立于使用的数据类型。
模板定义:函数模板以 template 关键字开始,后跟模板参数列表,这些参数是类型或非类型参数。
类型参数:代表一种数据类型,使用模板时,这些参数被特定的类型所替代。
非类型参数:代表一个值而非类型,它可以是一个整数或者指向某种类型的指针等。
示例
下面是一个简单的函数模板示例,它定义了一个交换两个值的模板函数:
template <typename T> void Swap(T& a, T& b) { T temp = a; a = b; b = temp; } int main() { int i = 10, j = 20; Swap(i, j); // 用于 int 类型 double x = 10.5, y = 20.5; Swap(x, y); // 用于 double 类型 return 0; }
在这个例子中,Swap 函数模板可以用于任何数据类型。当用于 int、double 或其他任何类型时,编译器会为每种类型生成一个特定的函数实例。
使用场景和注意事项
- 使用场景:函数模板特别适用于算法,这些算法的基本操作(如比较、交换、复制等)独立于操作的数据类型。
- 注意事项:
- 模板代码应保持简洁,以避免在实例化时产生过于复杂的代码。
- 某些复杂的情况可能需要特化模板,这是模板编程中的一个高级特性,允许您为特定类型提供特殊的实现。
- 在设计函数模板时,考虑类型安全和通用性。
总结
这篇主要从函数基础,参数传递,默认参数,函数重载,递归函数,内联函数,Lambda表达式,函数模板这几个方面简要介绍了一下c++函数相关的一些知识。