zoukankan      html  css  js  c++  java
  • 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不能用于将非多态基类的指针或引用,强制转换为派生类的指针或引用

    任世事无常,勿忘初心
  • 相关阅读:
    Activity和Service交互之bindService(回调更新UI)
    Service和Activity交互之广播方式
    自定义动态注册广播和静态注册广播
    Service
    AsyncTask
    播放视频
    播放音乐
    SurfaceView实现拍照预览
    从相册选取图片
    拍照并保存到指定文件夹
  • 原文地址:https://www.cnblogs.com/FlameBlog/p/14715299.html
Copyright © 2011-2022 走看看