版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/86440865
【每日C++】C++标准库
标签(空格分隔):【everyday】
文章目录
【每日C++】C++标准库
第一章 语言新特性
1.1 C++11 语言新特性
1.1.1 微小但重要的语法提升
- Template 表达式内空格
//两个template表达式的闭符之间的要求消失了
vector<list<int> >; // OK in each C++ version
vector<list<int>>; // OK since C++11
- nullptr 和 std::nullptr_t
C++11允许使用 nullptr 取代 0 或者 NULL,用来表示一个pointer(指针)指向所谓的 no value(注意,这不同于拥有一个不确定的值)。
nullptr 是个新关键字。它被自动转化为各种pointer类型,但是不会被转化为任何整数类型。它拥有类型std::nullptr_t,定义于.
例如:
void f(int);
void f(void*);
f(0) //calls f(int)
f(NULL) // calls f(int) if NULL is 0, ambiguous otherwise.
f(nullptr) // calls f(void*)
1.1.2 以auto完成类型自动推导
C++11 允许声明一个变量或对象(object)而不需要指明其类型,只需要说它为 auto.
例如:
auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
以auto声明的变量,其类型会根据其初值被自动推导出来,因此一定要一个初始化操作。例,auto i;//是一个错误的类型。
另外,可以为它加上额外的限定符,例如:satic auto i = 0.19
.
**如果类型很长或者表达式很复杂,auto 特别有用。**例如:
vector<int> v;
auto pos = v.begin(); // pos has type vector<int>::iterator
1.1.3 一致性初始化(Uniform Initialization)和 初值列(Initializer List)
在C++11之前,一个十分容易引起混淆的问题:如何初始化一个变量或者一个对象。初始化可因为小括号、大括号、赋值操作符的出现而发生。
对此,C++11引入了“一致性初始化”(uniform initialization)的概念,意思是面对任何初始化动作,都可以使用相同的语法,也就是使用 大括号。
例如,以下皆成立:
int values[] {1,2,3};
vector<int> v {2,4,6};
vector<string> cities {"BeiJing", "ShangHai"};
complex<double> c{4.0, 3.0} // equivalent to c(4.0,3.0)
初值列(initializer list)会强迫造成所谓 value initialization,意思指即使某一个local变量属于某一种基础类型(那通常不会有不明