C++11新特性(一)
2016-12-15 22:44
731 查看
1、auto类型说明符:
2、decltype():
3、 范围for语句
4、override ,final
5、类型别名:
6、lambda表达式:
7、标准库bind函数
8、标准库 function 类型
使用auto能让编译器替我们分析出表达式所属的类型; 例如: auto a = 3;//自动推断赋值号右边的表达式返回的类型,并声明a为对应的类型,此时相当于自动声明a为int类型
2、decltype():
返回操作数的数据类型,编译器分析表达式并得到它的数据类型 例如:decltype(3) b = 10;//推断出3的类型为int,并使用推断出来的类型声明b;
3、 范围for语句
for(declaration: expression ) statement expression可以是初始值列表( {1,2,3,4} )、数组、vector、string等类型的对象. 这些对象的共同特点是拥有能返回迭代器begin和end成员; 例如:
vector<int> V = {1,2,3,4}; for(auto r:V) { cout<<v<<endl;//这里的v代表容器中的元素 }
范围for语句的定义来源于与之等价的传统for语句: for(auto beg = v.begin(),end = v.end();beg!=end;++beg) { auto r = *beg; cout<<r<<endl; } 所以使用范围for语句需要注意不要在循环中添加/删除元素
4、override ,final
关键字:override 写在形参列表后 用来表示子类重写了父类的虚函数; 例如:virtual void func() override;//提高可读性 关键字:final 写在形参列表后 用来表示虚函数不可以被重写; 写在类名后边,表示类不可以被继承;
5、类型别名:
typedef int myInt;//传统方法 using myInt = int;//新方法,效果同上边一样
6、lambda表达式:
lambda表达式是一个可调用的对象,表示一个可调用的代码单元.可以看作一个未命名的内联函数. 和其他函数类似,lambda具有一个返回值类型、一个参数列表,一个函数体, 但与函数不同,lambda可能定义在函数内部。Lambda形式如下: [capture list](parameter list)->return type { function body } 其中: [capture list] 捕获列表 lambda所在函数中定义的局部变量的列表 [] // 不捕获任何函数内部变量,即lambda表达式内部不能使用所在函数内部变量 [=] // 以值的形式捕获所在函数内部变量 [&] // 以引用形式捕获所在函数内部变量 [x, &y] // x 以传值形式捕获,y 以引用形式捕获 [=, &z] // z 以引用形式捕获,其余变量以传值形式捕获 [&, x] // x 以值的形式捕获,其余变量以引用形式捕获 ( parameter list ) 形参列表 与普通函数相同 { function type } 函数体 与普通函数相同 可以忽略参数列表和返回值类型,但必须包含捕获列表和函数体
7、标准库bind函数
定义在头文件<functional>中,可以看成一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。 可以用来解决函数的默认参数只能放在最后的问题 调用bind的一般形式: auto newCallable = bind(callable,arg_list); newCallable 是一个新的可调用对象,arg_list 是一个逗号分割的参数列表,对应给定的callable的参数。 当我们调用newCallable 时,newCallable 会调用callable,并传递给它arg_list中的参数。 arg_list中包含形如_n的名字,n为整数。这些参数为占位符,表示newCallable中的参数,它们占据了传递给newCallable 的参数的位置。 _1为newCallable的第一个参数,_2为第二个参数,以此类推;
#include <functional> void callF(int a, int b) { printf("a : %d",a); printf("b : %d",b); } int main(int argc, const char * argv[]) { auto newCallF = std::bind(callF,1,std::placeholders::_2); newCallF(2,3);//可以通过输出结果验证上述介绍 return 0; }
8、标准库 function 类型
请先观察下边的代码有什么特点:
int add(int n1,int n2) { return n1 + n2; } auto sub = [](int n1,int n2)->int { return n1 - n2; }; struct divide { int operator()(int n1,int n2) { return n1/n2; } };
观察发现,上边的代码中"add"、"sub"、"divide"都是执行运算操作,调用形式都相同,但是它们本身的类型却并不相同. 如果我们想把上边这些可调用对象放在一个容器里边是不能实现的。如何解决? 定义在头文件<functional>中,function是一个模板,当创建一个具体的function类型时我们必须提供额外的信息,例如: function<int (int , int )> 此例声明一个function类型,它可以表示接受两个int类型参数 并且返回值类型为int的可调用对象的类型;
#include <functional> int main(int argc, const char * argv[]) { std::function<int(int,int)> f1 = add; std::function<int(int,int)> f2 = divide(); std::function<int(int,int)> f3 = sub; map<string,std::function<int(int,int)>> b = {{"+",f1},{"/",f2},{"-",f3}}; return 0; }
相关文章推荐
- C++11特性--作用域内枚举,显式转换符,类内成员初始化
- C++11 标准新特性: 右值引用与转移语义
- 每个C++开发者都应该使用的十个C++11特性
- C++11新特性,实现用字符串作为switch的case子句
- C++开发者都应该使用的10个C++11特性
- 【cocos2dx开发技巧10】cocosStudio的集成以及c++11的新特性
- C++11新特性emplace操作
- C++11的新功能特性对Boost库影响
- c++11特性与cocos2d-x 3.0之std::bind与std::function
- C++11新特性之auto
- C++11新特性
- C++11特性(7):auto、decltype(自匹配类型)
- 【编码随笔】了解C++11新特性
- c++11新特性的简单介绍
- C++11 标准新特性:Defaulted 和 Deleted 函数及constexpr
- 在C++98基础上学习C++11新特性
- C++11的新特性在linux下终端中的编译运行
- c++11特性之std::thread--进阶
- C++11新特性学习
- C++11的语法新特性