C++11新特性
1.Template 表达式内的空格
//“在两个 template 闭符之间放一个空格”的要求已经过时了:
std::vector<std::list<int> >; // OK in each C++ version
std::vector<std::list<int>>; // OK since C++11
2.nullptr 和 std::nullptr_t
//nullptr 是个新关键字。
//它被自动转换为各种 pointer 类型,但不会被转换为任何整数类型,
//其类型为std::nullptr_t,定义于 <cstddef>.
void f(int);
void f(void *);
f(0); // 调用 f(int).
f(NULL); // 如果定义NULL为0,则调用 f(int),否则调用 f(void *).
f(nullptr); // 调用 f(void *).
3.以 auto 完成类型自动推导
// C++11 允许你声明一个变量或对象而不需要指明其类型.
// auto 声明的变量,其类型会根据其初始值被自动推导出来,
// 因此一定需要一个初始化操作.
auto w; // 未指定初始值,错误!
auto i = 100; // i 为int类型.
double f()
{
return 3.1415926;
}
auto d = f(); // d 为double类型.
static auto VAT = 0.19; // VAT 为static double类型.
4.一致性初始化 与 初值列
// 一致性初始化:面对任何初始化动作,均可使用大括号.
int iNum[] { 1, 2, 3, 4, 5 };
std::vector<int> vecNum { 1, 2, 3, 4, 5 };
std::vector<std::string> vecStr { "aaa", "bbb", "ccc"};
std::complex<double> comNum { 4.0, 3.0}; //复数
// 初值列:强迫初始化为 0 (或nullptr).
int i; // i 初始化为未定义值.
int j{}; // j 初始化为 0 .
int * p; // p 初始化为未定义值.
int * q{}; // q 初始化为 0 .
// 窄化(精度降低或造成数值变动)对大括号而言是不成立的.
int x0(3.4); // ok.
int x1 = 3.4; // ok.
int x2 { 3.4 }; // wrong.
int x3 = { 3.4 }; // wrong.
std::vector<int> v1 { 1, 2, 3 }; // ok.
std::vector<int> v2 { 1.1, 2.2, 3.3 }; // wrong.
// 用户自定义类型之初值列(扩展:可用于定义可变参数函数).
void print(std::initializer_list<int> vals)
{
// 处理一系列值.
for(auto p = vals.begin(); p != vals.end(); ++p)
{
std::cout << *p << std::endl;
}
}
print({11,22,33,44,55,66});
5.关键字 explicit
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).