zoukankan      html  css  js  c++  java
  • C++11部分新特性

    这篇文章记录下部分C++11的新特性,有很多常用的也有很多一下子接受不了的。

    1.long long类型。

    2.列表初始化。

    3.nullptr常量。

    4.constexpr常量。

    5.类型别名声明。

    6.auto类型指示符。

    7.decltype类型指示符。

    8.标准库函数begin和end。

    9.initializer_list形参。

    10.lambda表达式。

    11.动态内存和智能指针。

    12.显式的类型转换符。

    13.正则表达式。

    1.long long 类型。

    2.列表初始化。

    int a=0;
    int a={0};
    int a{0};
    int a(0);

    上面是四种初始化方式,其中花括号初始化已经在c++11中全面使用,有以下特点。

    float a=3.14int b{a},b={a};//错误,不执行隐式转换,因为存在丢失信息的风险
    int b(a);//正确,执行了隐式转换,且丢失了信息。

    3.nullptr常量。

    nullprt是一个空指针值,下面几个式子是等效的。

    int *p1=nullptr;
    int *p2=0;
    int *p3 = NULL;//需要头文件stdlib.h,里面定义了预处理变量NULL,值为0

    4.constexpr常量。

    将变量声明为constexpr类型来确定它是一个常量表达式。

    例如:

    constexpr int mf = 20;
    constexpr int limit = mf+1;
    constexpr int a = res();//res必须返回一个constexpr型

    5.类型别名声明。

     有两种方法可以定义类型别名。

    1. 利用typedef

    2.利用using as(c++11)

    typedef  double base//base是double的别名
    using base = double//同上

    6.auto类型指示符。

    c++也能不管变量类型了,喜大普奔。

    auto i = 1,*p=&i;//正确
    auto j = 0,*q = 3.14;//错误,类型不一致

    7.decltype类型指示符。

    有时候我们想从一个函数的返回值知道变量的类型,又不想用返回值赋值变量。C++11就引入了第二种类型说明符decltype。

    int func(){return 1;}
    int x=2;
    decltype(func()) num = x;//利用func的返回类型声明变量并用x的值赋值

     此过程并不真正调用func函数。

    8.标准库函数begin和end。

    c++11多了两个与容器的函数同名的begin和end函数。

    int arr = {1,2,3,4,5};
    int *pts = begin(arr);//指向首地址
    int *pte = end(arr);//指向尾元素的下一位置指针

    9.initializer_list 形参。

    当我们不知道要传多少个参数給函数,但是却知道了这些参数的类型时,可以用initializer_list类型的形参。

     (其实感觉和vector一个样,唯一不同的是initializer_list的元素值只能是常值)

    10.Lambda表达式。

     capture listshii是一个捕捉列表,是lambda函数所在函数中的临时变量的列表,一般为空。

    (我们可以忽略参数列表和返回类型,但是必须要注意函数体和捕捉列表,且lambda必须使用尾置返回)

    std::vector<int> some_list;
    int total = 0;
    for (int i = 0; i < 5; ++i) some_list.push_back(i);
    //lambda用于for循环时 std::for_each(begin(some_list), end(some_list), [
    &total](int x) { total += x; });

    另一个例子:

    11.动态内存和智能指针

    C++中动态内存的管理是用new和delete来完成的。但是动态内存的使用很容易出问题,比如忘记回收空间,产生内存泄漏;或者指针还要引用的情况下就释放了它。为了更容易更安全的管理动态内存,新标准提供了两种智能指针,它们的行为类似普通指针,区别是它负责自动释放所指向的对象。

    shared_ptr:允许多个指针指向同一个对象。  

    unique_prt:独占所指向的对象。

    还有一个名为weak_ptr的伴随类,是一个弱引用,指向shared_ptr所管理的对象。

     make_shared函数

    最安全的分配和使用动态内存的方法为调用一个叫make_shared的函数。此函数在动态内存中分配一个对象并初始化它,返回此对象的shared_ptr。

    12.显式的类型转换符

    对于上述cin<<i语句,因为istream里没有定义<<,该代码可能cin会被转换成bool,再进一步变成int,则<<会变成左移运算符,与我们的预期大大相反。

    为了避免上述的事情发生,c++11引入了显式类型转换符explicit。

    13.正则表达式

    C++拥有了一个正则表达式库(RE库)。

    最好的开始时间是以前,其次是现在。
  • 相关阅读:
    MySQL 数据实时同步到 Elasticsearch 的技术方案选型和思考
    编写高质量可维护的代码之优化逻辑判断
    Java8 lambda表达式常见用法
    jar安装到maven本地仓库
    微信小程序获取用户手机号
    spring aop 、Redis实现拦截重复操作
    redis自定义RedisCacheManager
    locust做并发测试实战
    几个绕过短信验证码限制的漏洞挖掘
    通达OA任意用户登录和后台GetShell漏洞复现
  • 原文地址:https://www.cnblogs.com/dragonsbug/p/13645137.html
Copyright © 2011-2022 走看看