C++ 11 实用新特性总结
auto关键字
template <class T1,class T2>
auto add(T1x,T2 y)->decltype(x+y){
return x+y;
}
Lambda 表达式
只使用一次的函数对象,能否不要专门为其编写一个类?
只调用一次的简单函数,能否在调用时才写出其函数体?
形式 :
[外部变量访问方式说明符](参数表)->返回值类型语句组
{
语句组
}
外部变量访问方式说明符形式 :
- [=] 以传值的形式使用所有外部变量
- [] 不使用任何外部变量
- [&] 以引用形式使用所有外部变量
- [x,&y] x以传值形式使用,y以引用形式使用
- [=,&x,&y] x,y以引用形式使用,其余变量以传值形式使用
- [&,x,y] x,y以传值的形式使用,其余变量以引用形式使用
//可以在函数里定义函数
auto ff=[=,&y,&z](int n){
cout<<x<<endl; y++;z++;
return n*n;
};
cout <<ff(15)<<endl;
//作为函数指针进行传递
int a[4]={4,2,11,33};
sort(a,a+4,[](int x,int y)->bool {return ×%10<y%10;});
for_each(a,a+4,[](int x){cout<<x<<"";});
for_each(a.begin(),a. end(),[&](int &x){ total+=x;x*=2;});
//实现递归求斐波那契数列第n项:
function<int(int)>fib=[&fib](int n)
{return n<=2?1:fib(n-1)+fib(n-2);};
//function<int(int)>表示返回值为int,有一个int参数的函数
异常处理
try{
.......
throw typename(variable) //抛出任意类型(自定义类)变量
}
catch(typename variable){
}
catch(...){ //...表示任何异常
}
如果一个函数在执行的过程中,抛出的异常在本函数内就被catch块捕获并处理了,那么该异常就不会抛给这个函数的调用者(也称“上一层的函数”);如果异常在本函数中没被处理,就会被抛给上一层的函数。
cpp标准异常类
cpp标准库中有一些类代表异常,这些类都是从exception类派生而来
需要头文件
graph LR;
expection-->bad_typeid
expection-->bad_cast
expection-->bad_alloc
expection-->ios_base:failure
expection-->logic_error
logic_error-->out_of_range
- bad_cast 在用dynamic_cast进行从多态基类对象(或引用),到派生类的引用的强制类型转换时,如果转换是不安全的,则会抛出此异常。
- bad_alloc 在用new运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常。
- out_of_range 用vector或string的at成员函数根据下标访问元素时,如果下标越界,就会抛出此异常。
以上类存在 what()
函数获得异常字符串
类型检查
cpp运算符typeid是单目运算符,可以在程序运行过程中获取一个表达式的值的类型。typeid运算的返回值是一个type_info类的对象,里面包含了类型的信息。
需要头文件
使用方法
typeid(i).name(); //输出类型的字符串
强制类型转换类模板
static_cast
static_cast用来进用行比较“自然”和低风险的转换,比如整型和实数型、字符型之间互相转换。
static_cast不能来在不同类型的指针之间互相转换,也不能用于整型和指针之间的互相转换,也不能用于不同类型的引用之间的转换。
reinterpret_cast
reinterpret_cast用来进行各种不同类型的指针之间的转换、不同类型的引用之间转换、以及指针和能容纳得下指针的整数类型之间的转换。转换的时候,执行的是逐个比特拷贝的操作。
const_cast
用来进行去除const属性的转换。将const引用转换成同类型的非const引用,将const指针转换为同类型的非const指针时用它。
dynamic_cast
dynamic_cast专门用于将多态基类的指针或引用,强制转换为派生类的指针或引用,而且能够检查转换的安全性。对于不安全的指针转换,转换结果返回NULL指针。
ldynamic_cast不能用于将非多态基类的指针或引用,强制转换为派生类的指针或引用
任世事无常,勿忘初心