C++11新特性--Lambda表达式

C++11新特性–Lambda表达式

  • Lambda表达式

    功能:定义并创建匿名函数对象,以简化编程工作。

  • Lambda语法形式

    [函数对象参数] (操作符重载函数参数) mutable或exception声明->返回值类型 {函数体}

  • Lambda语法分析

    函数对象参数:表示Lambda开始,必须存在,不能省略。它传递给编译器自动生成函数对象类的构造函数。它只能使用定义在Lambda作用范围内可见的局部变量。其形式如下:
    1) 空:没有任何函数对象参数
    2) =:值传递,可见局部变量
    3) &:引用传递,可见局部变量
    4) this:类中成员变量
    5) =, &a, &b:a和b按引用传递,其余按值传递
    6) &, a, b:a和b按值传递,其余按引用传递
    操作符重载函数参数:
    1)():参数为空,可以省略
    2)(a, b):按值传递
    3)(&a, &b):按引用传递
    mutable或exception声明:
    1) 该部分可以省略。
    2) mutable:可修改,按值传递进行拷贝
    3) exception:指明函数抛出异常
    ->返回值类型
    1)在返回类型为void或存在return时,可以省略
    {函数体}
    1) 标明函数的实现,不能省略,但函数体可以空

  • 相关测试

    class CTest {
    public:
            CTest():m_nData(20) {}
            void TestLambda() {
                    vector<int> vecTemp;
                    vecTemp.push_back(1);
                    vecTemp.push_back(2);
                    cout << "Lambda:无函数对象参数" << endl;
                    {
                            for_each(vecTemp.begin(), vecTemp.end(), [](int v) { cout << v << endl;});
                    }
                    cout << "Lambda:以值方式传递作用域内所有可见的局部变量(包括this)" << endl;
                    {
                            int a = 10;
                            for_each(vecTemp.begin(), vecTemp.end(), [=](int v) { cout << v+a << endl;});
                    }
                    cout << "Lambda:以引用方式传递作用域内所有可见的局部变量(包括this)" << endl;
                    {
                            int a = 10;
                            for_each(vecTemp.begin(), vecTemp.end(), [&](int v){ cout << v+a << endl;});
                            cout << a << endl;
                    }
                    cout << "Lambda:以值方式传递局部变量" << endl;
                    {
                            int a = 10;
                            for_each(vecTemp.begin(), vecTemp.end(), [a](int v)mutable{cout << v+a << endl; a++;});
                            cout << a << endl;
                    }
                    cout << "Lambda:以引用方式传递局部变量" << endl;
                    {
                            int a = 10;
                            for_each(vecTemp.begin(), vecTemp.end(), [&a](int v)mutable{cout << v+a << endl; a++;});
                            cout << a << endl;
                    }
                    cout << "Lambda:以引用方式传递局部变量" << endl;
                    {
                            for_each(vecTemp.begin(), vecTemp.end(), [this](int v){cout << v+m_nData << endl;});
                            cout << a << endl;
                    }
                    cout << "Lambda:以引用方式传递局部变量" << endl;
                    {
                            int a = 10;
                            for_each(vecTemp.begin(), vecTemp.end(), [&a](int v)mutable{cout << v+a << endl; a++;});
                            cout << a << endl;
                    }
                    cout << "Lambda:以引用方式传递局部变量" << endl;
                    {
                            for_each(vecTemp.begin(), vecTemp.end(), [this](int v){cout << v+m_nData << endl;});
                    }
                    cout << "Lambda:除b按引用传递外,其他均按值传递" << endl;
                    {
                            int a = 10;
                            int b = 15;
                            for_each(vecTemp.begin(), vecTemp.end(), [=, &b](int v){ cout << v+a << endl; b++;});
                            cout << b << endl;
                    }
                    cout << "Lambda:操作符重载函数参数按值传递" << endl;
                    {
                            for_each(vecTemp.begin(), vecTemp.end(), [](int v){ v++; cout << v << endl;});
                    }
                    cout << "Lambda:操作符重载函数参数按引用传递" << endl;
                    {
                            for_each(vecTemp.begin(), vecTemp.end(), [](int &v){ v++; cout << v << endl;});
                    }
                    cout << "Lambda:空Lambda表达式" << endl;
                    {
                            [](){}();
                            []{}();
                    }
            }
    private:
            int m_nData;
    };
    
    int main() {
            CTest test;
            test.TestLambda();
            return 0;
    }
    

    编译g++ -g -Wall -std=c++11 main1.cpp -o main1
    执行:./main1,对应执行结果如下:

    Lambda:无函数对象参数
    1
    2
    Lambda:以值方式传递作用域内所有可见的局部变量(包括this)
    11
    12
    Lambda:以引用方式传递作用域内所有可见的局部变量(包括this)
    11
    12
    10
    Lambda:以值方式传递局部变量
    11
    13
    10
    Lambda:以引用方式传递局部变量
    11
    13
    12
    Lambda:以引用方式传递局部变量
    21
    22
    Lambda:除b按引用传递外,其他均按值传递
    11
    12
    17
    Lambda:操作符重载函数参数按值传递
    2
    3
    Lambda:操作符重载函数参数按引用传递
    2
    3
    Lambda:空Lambda表达式
    

参考文献:https://blog.csdn.net/pleasecallmewhy/article/details/34941721

猜你喜欢

转载自blog.csdn.net/yzhang6_10/article/details/81557865