zoukankan      html  css  js  c++  java
  • C++ 一些特性

    1、  初始化列表std::initializer_list,头文件<initializer_list>

    C++11提供了模板类template<class T> class initializer_list,可将其用于构造函数的参数,如果类有接受initializer_list作为参数的构造函数,则初始化列表语法就只能用于该构造函数。列表中的元素必须是同一种类型或可转换为同一种类型。除了可以用于构造函数外,还可将initializer_list用作常规函数的参数。用法如下

    int sum(const std::initializer_list<int> &list)

    {

        int sum = 0;

        for (auto it = list.begin(); it < list.end(); it++)

        {

            sum = sum + *it;

        }

     

        return sum;

    }

     

    int _tmain(int argc, _TCHAR* argv[])

    {

        int s = sum({ 1, 2, 3, 4 });

        std::cout << s << std::endl;

        return 0;

    }
     

    2、  C++提供了多种简化声明的功能,尤其在使用模板时。
     
    C++11将auto用于实现自动类型推断。
    auto num = 10;//num is type int
    同时还可以简化模板。
    for (auto it = list.begin(); it < list.end(); it++)
     
    关键字decltype将变量的类型声明为表达式指定的类型,下面的语句的含义是,让y的类型与x相同,其中x是一个表达式。
    decltype(x)y;
     
    返回类型后置,即在函数名和参数列表后面指定返回类型。如下所示:

    double f1(double, int);

    auto f2(double, int) -> double;

    这样就能解决在编译器遇到参数列表之前,T和U还不在作用域内,因此必须在参数列表后使用decltype。

    template<typename T,typename U>

    auto f3(T, U) ->decltype(T*U);

     

    3、  

    在函数后noexcept来指出函数不会发生异常。

    void get() noexcept;

     

    在函数前加上explicit解决自动类型转换的问题。

    explicit Test(double);//指定只能是double值,像int值就不行

     

    关键字delete可用于禁止编译器使用特定方法。

    关键字default只能用于6个特殊函数,可以显示地声明这些方法的默认版本。

     

    虚函数说明符override指出你要覆盖一个虚函数,将其放在参数列表后面。这样,如果参数类型不对,编译器就会报错。

    说明符final禁止派生类覆盖特定的虚方法。

     

    4、  lambda表达式

    int count = 6;

    [&count](int x){count += (x % 13); };

    lambda表达式对提使用函数谓词的STL算法来说尤其如此。

     

    什么是函数谓词?函数谓词是一个判断式,一个返回bool值的函数/函数符/lambda函数。

    我们以计算一个vector<int>中有多少个被3整除的数为例,使用标准模板库中count_if函数:

    函数指针:

    bool f3(int x){ return x % 3 == 0; }

    vector<int> temp = { 1, 2, 3, 4, 5, 6 };

    count = count_if(temp.begin(), temp.end(), f3);

     

    函数符( 它是一个类对象,重载了操作符() ):

    class f_mode

    {

    private:

        int dv;

    public:

        f_mode(int d = 1) :dv(d){}

        bool operator()(int x) { return x % 3 == 0;}

    };

    f_mode f4(3);

    bool result = f4(7);//返回7%3 == 0, 即返回false

    vector<int> temp = { 1, 2, 3, 4, 5, 6 };

    count = count_if(temp.begin(), temp.end(), f4);

     

    最后是使用lambda的情况,在C++11中对于接受函数指针或函数符的函数,可使用匿名函数定义(lambda)作为其参数。

    [](int x){return x%3 == 0;}

    这与函数f3很像

    bool f3(int x){ return x % 3 == 0; }

    使用[]替代了函数名(这就是匿名的由来);没有声明返回类型。返回类型相当于使用decltype根据返回值推断得到的,这里为bool。如果lambda不包含返回语句,推断出的返回类型为void。就当前这个示例而言,可以写成如下:

    vector<int> temp = { 1, 2, 3, 4, 5, 6 };

    count = count_if(temp.begin(), temp.end(),[](int x){return x%3 == 0;});

    仅当lambda表达式完全由一条返回语句组成时,自动类型推断才管用;否则需要使用新增的返回类型后置语法:

    [](double x)->double{int y=x;return x-y;}

     

    我们在使用时,如果想重复使用一个lambda,那我们可以为这个lambda指定一个名称,这样就不用编写多次lambda了。

    auto f5 = [](int x){return x%3 == 0;}

    vector<int> temp = { 1, 2, 3, 4, 5, 6 };

    count = count_if(temp.begin(), temp.end(),f5);

    也可以直接当成函数来使用:

    bool result = f5(13);

     

    lambda还有一些额外的功能。lambda可访问作用域内的任何动态变量;要捕获要使用的变量,可将其名称放在中括号内。如果只指定了变量名[z],将按值访问变量;如果在名称前加上引用[&count],将按引用访问变量。[&]让您能够按引用访问所有动态变量,[=]让您能够按值访问所有动态变量,还能混合使用,[&, ted]让你能够按值访问ted,按引用访问其他所有动态变量。

  • 相关阅读:
    Jquery所有获取对象
    使用VS Code 调试Vue
    Http请求
    Xml,Json序列化
    SqlServer函数使用
    FastReport关闭打印提示框
    求面试经验
    pyspark基于python虚拟环境运行
    idea配置本地spark本地开发环境
    carbondata使用总结
  • 原文地址:https://www.cnblogs.com/merlinzjl/p/10367506.html
Copyright © 2011-2022 走看看