原创内容:cxsmarkchan
转载请注明出处
右值引用是C++11的重要特性之一,合理采用右值引用,可以避免不必要的复制操作,提高程序运行的效率。本文以swap函数的实现为例,说明右值引用的相关应用。
1 swap函数的传统实现方法及其问题
一个典型的swap函数如下:
template<class T>
void swap(T& a, T& b){
T tmp = a; //调用复制构造函数
a = b; //调用operatpr=
b = tmp; //调用operatpr=
}
如果T是简单类型,则上述转换没有问题。但如果T是含有指针的复合数据类型,则上述转换中会调用一次复制构造函数,两次赋值运算符重载。以一个向量类型为例:
class vector{
private:
int *_arr;
int _size;
public:
//仅考虑复制构造函数和赋值运算符重载
vector(const vector& _right){
_size = _right._size;
_arr = new int[_size];
for(int i = 0; i < _size; i++){
_arr[i] = _right._arr[i]; //该步骤需要重复_size次