c++函数介绍(二)

简介: c++函数介绍(二)

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++函数相关的一些知识。


接下继续先把c++基础知识搞完,然后整点提高版,有点深度的!!!

有兴趣的朋友,点个赞,加个关注啊



目录
相关文章
|
28天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
45 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
23 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
158 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
30 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
3月前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
34 6