zoukankan      html  css  js  c++  java
  • 工欲善其事必先利其器之C++11新特性(1)

    工欲善其事必先利其器之C++11新特性(1)

    0. 序言

    ​ 合格的图形学程序员,掌握一门编程语言是至少的,而现有的图形学图书,课程等都是采用C++作为其主要的编程语言,甚至GLSL,HLSL语法都要接近于C++,我猜想是因为C++更加接近底层,许多的特性也赋予了C++更多的灵活性,同时C++较之于C拥有了面向对象的特性也很适合在绘制不同场景不同物体,所以C++作为我们"绘画"的画笔,我们也要充分的了解它。本文将主要介绍C++11的新添加的特性,主要参考C++ Primer Plus书中的内容。

    1. C++11新特性

    1.0 新类型

    long longunsigned long long均为C++11新增的类型。

    char16_tchar32_t可以支持16位和32位的字符。

    1.1 统一的初始化

    ​ C++11中扩大了可以采用大括号{}来进行初始化的范围。使其可用于所有内置类型和用户定义的类型。

    例:

    int x = {5};
    int y{10};
    short quar[5] {4,5,2,76,1};
    int *ar = new int [4] {2,4,6,7};
    

    缩窄 : 禁止将数值赋给无法存储它的数值变量。

    char c1 = 1.57e27;    //合法
    char c2 = 459585821;    //合法
     
    char c3 {1.57e27};    //非法,编译错误
    char c3 {459585821};    //非法,编译错误
    

    std::initializer_list : 模板类,可以用来作为构造函数和常规函数的参数。

    1.2 声明

    1.2.0 auto

    auto : 实现自动类型判断。

    for(auto item : items)
    {
        ...
        //operation
        ...
    }
    

    1.2.1 decltype

    decltype : 关键字decltype将变量的类型声明为表达式指定的类型。

    //让y的类型与x相同
    decltype(x) y;
    

    1.2.2 返回类型后置

    如标题所言,我们现在可以将返回值放在函数声明的后边

    auto f2(double,int) -> double == double f2(double,int);
    

    这个特性配合decltype可以更好的来写模板函数

    template<typename T,typename U>
    auto eff(T t, U u) -> decltype(T * U)
    {
        ...
    }
    

    1.2.3 模板别名:using =

    using 来代替typedef

    typedef std::vector<std::string>::iterator itType;
    ==
    using itType = std::vector<std::string>::iterator;
    

    1.2.4 nullptr

    嗯,这个就不多说了。用来特指空指针,请尽量使用nullptr

    1.3 智能指针

    ​ C++11废除了原来的auto_ptr转而用unique_ptr,shared_ptr,weak_ptr来代替。至于各个是什么就不用解释了吧。

    1.4 模板和STL方面的修改

    1.4.0 基于范围的for循环

    double prices[5] = {4.99,10.99,6.87,7.99,8.49};
    for( auto item : prices)
    {
        ...
    }
    

    1.4.1 新的STL容器

    unordered_map , unordered_set , unordered_multimap , unordered_multiset

    forward_list——单链表

    1.5 右值引用

    首先先看看左值:左值是一个表示数据的表达式,程序可获取其地址。

    右值:简而言之也就是等号右边的值,我们不能对其应用地址运算符,包括字面常量,函数的返回值(注意返回值不是引用)。

    右值引用:关联右值的变量,注意虽然我们不能对右值取地址,但是却可以对右值引用取地址。

  • 相关阅读:
    数据库三大范式另一角度的理解
    Log4j和Slf4j的联系和区别
    cglib和Jdk的对比
    Git- 忽略文件 ignore 无效
    GIT报错:git did not exit cleanly (exit code 1)
    Nginx和Zuul配合使用后,Cookie写入问题
    RabbitMQ报错:undefined: There is no template at js/tmpl/login.ejs
    Feign报错:The bean 'xxxxx.FeignClientSpecification' could not be registered.
    ES报错:NoNodeAvailableException[None of the configured nodes are available
    SpringBoot报错:
  • 原文地址:https://www.cnblogs.com/haiyi/p/12854217.html
Copyright © 2011-2022 走看看