使用[this]可捕获当前对象指针,使Lambda能访问成员变量和函数,如调用setValue和print;需注意对象生命周期,避免悬空指针引发未定义行为。
在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] 捕获了当前对象,因此可以自由调用 setValue 和 print 成员函数,也可以直接读写 value 成员变量。
注意事项与生命周期问题
虽然捕获 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中访问类成员的简洁方式,只要注意作用域和生命周期,就能安全使用。
评论(已关闭)
评论已关闭