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

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

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

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

posted @ 2020-05-09 00:58  lhyakn  阅读(163)  评论(0编辑  收藏  举报