• 工欲善其事必先利其器之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 右值引用

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

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

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

  • 相关阅读:
    springmvc学习笔记--json--返回json的日期格式问题
    springmvc学习笔记--mybatis--使用插件自动生成实体和mapper
    velocity的一些用法
    String.split()用法以及特殊分隔符注意,ps:|
    Mybatis在idea中错误:Invalid bound statement (not found)
    maven中使用junit老是找不到包
    java字符编码和oracle乱码
    ehcache报错
    java继承覆盖与向上转型,权限
    java变量的加载顺序
  • 原文地址:https://www.cnblogs.com/haiyi/p/12854217.html
Copyright © 2020-2023  润新知