复制代码
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++教程频道。










