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,然后将他的值++。

浙公网安备 33010602011771号