工欲善其事必先利其器之C++11新特性(1)
0. 序言
合格的图形学程序员,掌握一门编程语言是至少的,而现有的图形学图书,课程等都是采用C++作为其主要的编程语言,甚至GLSL,HLSL语法都要接近于C++,我猜想是因为C++更加接近底层,许多的特性也赋予了C++更多的灵活性,同时C++较之于C拥有了面向对象的特性也很适合在绘制不同场景不同物体,所以C++作为我们"绘画"的画笔,我们也要充分的了解它。本文将主要介绍C++11的新添加的特性,主要参考C++ Primer Plus书中的内容。
1. C++11新特性
1.0 新类型
long long
和unsigned long long
均为C++11新增的类型。
char16_t
和char32_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 右值引用
首先先看看左值:左值是一个表示数据的表达式,程序可获取其地址。
右值:简而言之也就是等号右边的值,我们不能对其应用地址运算符,包括字面常量,函数的返回值(注意返回值不是引用)。
右值引用:关联右值的变量,注意虽然我们不能对右值取地址,但是却可以对右值引用取地址。