c++11简介
从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。
本期及后续文章会对c++11常用特性进行讲解。
列表初始化
在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如
struct Date{ int _a; int _b; }; Date d1={10,20}; int arr[]={1,2,3,4,5,6,7,8};
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
列如:
vector<int> v1={1,23,4,5,6,7,8,69}; vector<int> v2{10,20,30}; list<int> l1={10,20,30}; list<int> l2{1,2,3,4};
也要将其与类类型的初始化列表分清楚
class Date { public: // 初始化列表 Date(int year=10, int month=20, int day=0) :_year(year) , _month(month) , _day(day) {} private: int _year; int _month; int _day; };
std::initializer_list
由上可知,再对stl容器调用过程中,它的初始化列表可以是任意长度的:
vector<int> v1={1,23,4,5,6,7,8,9}; vector<int> v2={1,2,3};
那它是如何实现的呢,和c语言中的变长数组有什么区别嘛:
int arr[] = { 10,2,3,4 }; auto a1 = { 10,20,30 }; //查看变量类型 cout << typeid(arr).name() << endl; cout << typeid(a1).name() << endl;
结果:
可以看的,a1的类型是std::initializer_list<int>
这是c++11中新增的构造函数,当你使用花括号对stl容器调用时,会匹配这个构造函数,c++11中的容器都新增了initializer_list构造。
还有initializer_list赋值
vector<int> v1; v1={1,2,3,4,5,6,7};
auto
C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。
能更好的帮助我们简化代码,如:
std::map<string,string>::iterator it=m1.begin();
类型名如此之长,是不是很恐怖,当我们用上auto后,简化为:
auto it =m1.begin();
简便了很多,但是降低了代码的可读性,需要你对代码类型有一定的了解。
decltype
关键字decltype将变量的类型声明为表达式指定的类型。
int x = 1; double y = 2.2; decltype(x * y) ret; // ret的类型是double decltype(&x) p; // p的类型是int*
上述用处auto 也可以代劳,但是
当需要传类型的时候是无法被替代的:
vector<decltype(x*y)> v;
此处auto无法使用。
nullptr
由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。
#define NULL 0
结语
我是Tom-猫,
如果觉得有帮助的话,记得
一键三连哦ヾ(≧▽≦*)o。
咱们下期再见。