C++ 11/14新特性
C++11是自C++98十余年来发布的一个新特性,扩充了很多C++的功能和特性,而C++14是对C++11的又一次补充和优化,这些新特性使得C++更贴近于一种现代化的变成语言。gcc版本大于5(clang版本大于3.8)已经全面支持C++14,并且在编译时需要开启std=c++14选项用来支持c++14的特性,推荐在代码中直接使用c++14特性而不是c++11。
类型推导和判断
类型推导
auto关键字早已存在于C++当中,假如一个变量类型不是register,那么就是auto。但是随着register的弃用(编译器自动优化变量存放位置),auto的语意也显得多此一举了,因此c++11赋予关键字auto新的语意实现自动类型推导,其推导阶段在编译期实现,而且由于编译期间需要判断左右值是否匹配,所以不会对编译和运行速度带来影响:
类型判断
类型判断的引入主要是为了获取变量的类型,使用decltype()
可以在编译期间获取变量的类型:
序列迭代
C++11引入了一种简单的for语法用于快速迭代序列:
1 std::vector<int> a = ; 2 for (auto item : a)初始化列表扩展
我们知道,c++可以使用实现对数组、普通的结构体(没有构造函数和析构函数)的初始化,但是初始化列表并不能对对象和函数使用,因此c++11使用
std::initializer_list
对这一特性进行了拓展:
其次,c++提供了统一的形式,完成对任意类型对象的初始化:
1 class Person ; 4 private: 5 std::string name; 6 int age; 7 std::string id; 8 }; 9 10 struct Person_; 12 private: 13 std::string name; 14 int age; 15 std::string id; 16 }; 17 //统一的初始化语法 18 Person c_person ; 19 Person_ s_person ;类特性修改
类中默认函数行为
我们知道在没有指定的情况下,c++会对类设置默认的构造函数、拷贝构造函数、赋值函数以及析构函数,但是有时候我们并不需要这些默认函数,因此在C++11中引入了对这些特性进行精确控制的特性:default指定生成默认函数,delete指定禁用默认函数。如果禁用了默认的构造函数和析构函数,必须指定一个自定义的函数。
构造函数特性
C++11提供了两种新的构造函数特性,用于提升类构造的效率,分别是委托构造和继承构造,前者主要用于多构造函数的情况,而后者用在类继承方面:
- 委托构造
委托构造的本质为了简化函数代码,做到复用其他构造函数代码的目的。
1 class Test 6 Test(int _b) : Test() 9 10 int a,b; 11 }; 12 13 Test t(2); //会调用Test()将a赋值为1- 继承构造
c++在继承的时候,需要将构造函数的参数逐个传递到积父类的构造函数中完成父类的构造,这种效率是很低下的,因此c++11引入了继承构造的特性,使用using
关键字:
显式控制虚函数重载
由于虚函数的特性,可能会被意外进行重写,为了做到精确对虚函数重载的控制,c++11使用了override
和final
关键字完成对这一特性的实现,下面看例子:
而final
关键字是为了显式终结类的继承和虚函数的重载使用:
nullptr
和constexpr
之所以引入nullptr
是为了解决NULL
的诟病,在之前的c++中,NULL
可以被定义为int
0或者一个0值的指针,这就带来一个问题:
而nullptr
现在定义为一个空指针,避免了NULL带来的问题。constexpr
定义了一个用户显式的声明函数或对象构造函数在编译期间会成为常数,从 C++14 开始,constexptr
函数可以在内部使用局部变量、循环和分支等简单语句:
强枚举类型
c++11引入了enum class
来保证枚举不会被隐式转换:
模板增强
类型别名
使用using
关键字更加直观的定义别名:
变长模板和默认模板参数
c++11可以在定义模板时,给与模板一个默认的类型,这样可以在不设置类型的时候使用默认类型:
template <typename T = int, typename U = std::string>同时c++11可以设置模板参数为任意个数:
1 template <typename T1, typename... TS> //可以接受至少一个模板类型 2 template <typename... TS> //至少0个Lamda表达式
lamda表达式的语法如下:
1 [捕获列表] (函数参数) 异常属性 > 返回类型捕获列表是lamda表达式内部使用的外部参数列表。
标准库扩充
c++11对多个标准库进行了扩充,包括:
1. 新增加容器
数组容器:std::array
单项链表容器:std::forward_list
无序容器:std::unordered_set
无序映射:std::unordered_map
元组:std::tuple
2. 正则表达式
3. 语言级的线程支持
4. 智能指针和引用计数
5. 函数绑定和包装
下一篇:进程间通信的6种方式
C/C++