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不能用于将非多态基类的指针或引用,强制转换为派生类的指针或引用

posted @ 2021-04-28 22:16  FlameAlpha  阅读(118)  评论(0编辑  收藏  举报