C++11新特性,auto、decltype、nullptr、Lambda

C++的发展

C++11的新特性

auto

可以从初始化表达式中推断出变量的类型,属于编译器特性,不影响最终的机器码

    auto a = 10;
    auto str = "hello";
    auto p = new Person();
    p->run();

decltype

可以获取变量的类型和OC中的typeof一样

    int a = 10;
    decltype(a) b = 20;

nullptr

主要解决NULL的二义性问题

void func(int v) {
    cout << "func(int v)" << endl;
}

void func(int *v) {
    cout << "func(int *v)" << endl;
}

int main(){
    func(NULL); //无法分辨是哪个函数
    return 0;
}

快速遍历

    int array[] = {11,2,33,44,55};
    for(int i : array) {
        cout << i << endl;
    }

Lambda 表达式

有点类似于JavaScript中的闭包、iOS中的Block,本质就是函数
完整结构: [capture list] (params list) mutable exception-> return type { function body }

参数说明
capture list:捕获外部变量列表
params list:形参列表,不能使用默认参数,不能省略参数名
mutable:用来说用是否可以修改捕获的变量
exception:异常设定
return type:返回值类型
function body:函数体

有时可以省略部分结构
[capture list] (params list) -> return type {function body}
[capture list] (params list) {function body}
[capture list] {function body}

example

赋值给函数指针调用

    int (*p1)(int,int) = [](int v1,int v2){
        return v1 + v2;
    };

    //等同上面
    auto p2 = [](int v1,int v2){
        return v1 + v2;
    };
    cout << p1(10,10) << endl;

直接调用

    auto rt = [](int v1,int v2){
        return v1 + v2;
    }(10,10);

    cout << rt << endl;

作为参数传递

int func(int a, int b,int(*fun)(int,int)) {
    return fun(a,b);
}

int main(){

    cout << func(10,10,[](int v1,int v2){ return v1 + v2; }) << endl;
    cout << func(10,10,[](int v1,int v2){ return v1 - v2; }) << endl;
    cout << func(10,10,[](int v1,int v2){ return v1 * v2; }) << endl;
    cout << func(10,10,[](int v1,int v2){ return v1 / v2; }) << endl;
    return 0;
}

Lambda 对外部变量的捕获

值捕获

    int a = 10;
    int b = 20;
    auto func = [a,b](){
        cout << a << endl;
        cout << b << endl;
    };
    func();

引用捕获(可以修改外面的值)

    int a = 10;
    int b = 20;
    auto func = [&a,b](){
        a++;
        cout << a << endl;
        cout << b << endl;
    };
    func();
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;

隐式值捕获

    int a = 10;
    int b = 20;
    auto func = [=](){
        cout << a << endl;
        cout << b << endl;
    };
    func();

隐式地址捕获

    int a = 10;
    int b = 20;
    auto func = [&](){
        cout << a << endl;
        cout << b << endl;
    };
    func();

区分捕获

b是 值捕获,其他是地址捕获

    int a = 10;
    int b = 20;
    auto func = [&,b](){
        a++;
        cout << a << endl;
        cout << b << endl;
    };
    func();

a是地址捕获,其余是值捕获

    int a = 10;
    int b = 20;
    auto func = [=,&a](){
        a++;
        cout << a << endl;
        cout << b << endl;
    };
    func();

Lambda 的mutable

    int a = 10;
    int b = 20;
    auto func = [a]()mutable{
        a++;
        cout << a << endl;
    };
    func();
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;

结果:
11
a:10
b:20

相当于在在函数内部创建了一个int a,然后将他的值++。

posted @ 2021-08-05 17:07  弄啥来  阅读(164)  评论(0)    收藏  举报