boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

C++11 lambda表达式捕获this使用方法


avatar
作者 2025年9月15日 10

使用[this]可捕获当前对象指针,使Lambda能访问成员变量和函数,如调用setValue和print;需注意对象生命周期,避免悬空指针引发未定义行为。

C++11 lambda表达式捕获this使用方法

在C++11中,lambda表达式可以捕获当前对象的 this 指针,以便在lambda内部访问类的成员变量和成员函数。使用方法简单直接,主要通过值捕获的方式将 this 引入lambda的作用域

捕获 this 的基本语法

在lambda的捕获列表中写上 this,即可捕获当前对象的指针:

[ this ] { /* 可以访问当前对象的成员 */ }

这里的 this 是按值捕获的——即复制了调用时的 this 指针,而不是引用。但由于 this 本身就是指针,所以“值捕获”意味着复制指针值,指向同一个对象。

实际使用示例

下面是一个典型例子,展示如何在成员函数中使用 lambda 捕获 this

立即学习C++免费学习笔记(深入)”;

class MyClass {
public:
    void setValue(int v) { value = v; }
    void print() const { std::cout << “Value: ” << value << std::endl; ; }

    void doSomething() {
        auto lambda = [this]() {
            setValue(42);      // 调用成员函数
            print();           // 调用另一个成员函数
        };
        lambda();  // 执行lambda
    }

private:
    int value = 0;
};

在这个例子中,lambda通过 [this] 捕获了当前对象,因此可以自由调用 setValueprint 成员函数,也可以直接读写 value 成员变量。

C++11 lambda表达式捕获this使用方法

boardmix博思白板

boardmix博思白板,一个点燃团队协作和激发创意的空间,集aigc,一键PPT,思维导图,笔记文档多种创意表达能力于一体,将团队工作效率提升到新的层次。

C++11 lambda表达式捕获this使用方法39

查看详情 C++11 lambda表达式捕获this使用方法

注意事项与生命周期问题

虽然捕获 this 很方便,但必须注意对象的生命周期。如果lambda被存储并在对象销毁后调用,使用 this 将导致未定义行为:

std::function<void()> func;

void dangerousCapture() {
    auto lambda = [this]() { print(); };
    func = lambda; ;  // 延长lambda生命周期
}  // 当前对象可能在此析构

上面代码中,如果 func 在对象销毁后被调用,就会访问已释放的内存。建议在这种场景下使用 shared_from_this 配合 std::enable_shared_from_this 来管理生命周期。

基本上就这些。捕获 this 是C++11 lambda中访问类成员的简洁方式,只要注意作用域和生命周期,就能安全使用。



评论(已关闭)

评论已关闭