C++11的新特性简单汇总介绍 (二)

2020-01-06 15:34:39丽君

 

复制代码
TestClass::TestClass(TestClass &&t) noexcept //移动构造函数不应该抛出任何异常
:x(t.x),y(t.y),z(t.z),p(t.p)
{
  t.p=nullptr; // 实现移动操作之后需要保证被移动的对象的析构是安全的,所以源对象的指针成员置为空,随后t的析构函数将会被自动调用,t被销毁。
}

 

8. function

C++11中提供了名为function的标准库类型,定义在头文件<functional>中,该类型用来存储一个可调用的对象,统一了所有可以像函数一样调用的调用形式,例如:


#include <functional>
#include <iostream>
using namespace std;
 
int add(int x,int y)
{
  return x+y;
}
 
class Add
{
  public:
    int operator()(int x,int y)
    {
      return x+y;
    }
};
 
void main()
{
 //function模版的参数是函数调用形式,包括返回类型,以及参数列表个数和类型
  function<int(int,int)> f1 = add; //函数指针
  function<int(int,int)> f2 = Add(); // 可调用类对象
  function<int(int,int)> f3 = [](int x,int y){return x+y;}; //lambda表达式
   
  cout<<f1(10,20)<<" "<<f2(30,40)<<" "<<f3(50,60)<<endl;
}

9. 其他新增类型(array,forward_list,bitset,regex)

实际上C++11中除了一些语法特性新增之外,还增加了一些新的库。例如array相当于我们传统使用的定长数组,支持随机访问,不能添加删除元素,不可以像vector一样增长,使用array比传统数组更加安全。

forward_list是C++11中增加的单向链表

regex则是C++11中新增的正则表达式

10. 总结

C++11中增加了一些库,库本身的使用不做过多介绍,可以参考C++标准库/STL源码剖析,这都是用单独的大部头书籍讲解的,有些特性和库是我感觉比较惊艳的,例如:

    auto 定义:可以让编译器自动推算定义的变量类型,而不需要写长长的一串类型,特别是在含有迭代器的类型上。 decltype :可以根据已知的变量来定义一个跟该变量一样的类型。 lambda:个人认为这是C++11中增加的最惊艳的特性之一,对应的还有bind()函数,其实这些内容是从Boost中来的。 智能指针:shared_ptr 虽然在以前的C++中有类似auto_ptr的智能指针,但是auto_ptr有一些缺陷并不算很好用。 function类型:标准库的function类型定义了一种可调用对象,该类型统一了所有可以当作函数一样调用的调用形式,例如lambda,函数指针,重载了函数调用运算符()的类对象等,该特性也是参考了Boost库。 regex库:C++11中总算有了方便的regex可以使用了。
 

注:相关教程知识阅读请移步到C++教程频道。