1. 列表初始化
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值替代。(C++ Primer)
作为C++11新标准的一部分,用花括号来初始化变量得到了全面应用,这种初始化的形式被成为列表初始化。
int* a = new int { 3 };
double b = double{ 12.12 };
int * arr = new int[] {1, 2, 3};
无论是类的变量,数组,stl的容器,类的构造,都统一使用{},以后只要是初始化就首先考虑{}的初始化就OK了。
2、C++11新的声明
2.1 auto
C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。
例如:
int main()
{
int i = 10;
auto p = &i;
auto pf = strcpy;
cout << typeid(p).name() << endl;
cout << typeid(pf).name() << endl;
map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
//map<string, string>::iterator it = dict.begin();
auto it = dict.begin();
return 0;
}
使用auto可以使代码写起来更加的简单、便捷。
2.2 decltype
关键字decltype将变量的类型声明为表达式指定的类型。
例如:
// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{
decltype(t1 * t2) ret;
cout << typeid(ret).name() << endl;
}
int main()
{
const int x = 1;
double y = 2.2;
decltype(x * y) ret; // ret的类型是double
decltype(&x) p; // p的类型是int*
cout << typeid(ret).name() << endl;
cout << typeid(p).name() << endl;
int z = 0;
decltype(z) tmp;
cout << typeid(tmp).name() << endl;
F(1.1, 1.1);
return 0;
}
2.3 nullptr
由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif