C++11 引入了右值引用,它允许我们识别临时对象(也就是右值),从而可以避免不必要的拷贝和提高程序性能
下面是一些使用右值引用的示例:
class MyClass { public: MyClass() { std::cout << "Default constructor called" << std::endl; } // 移动构造函数 MyClass(MyClass&& other) noexcept { std::cout << "Move constructor called" << std::endl; data = other.data; other.data = nullptr; } // 移动赋值运算符 MyClass& operator=(MyClass&& other) noexcept { if (this != &other) { std::cout << "Move assignment operator called" << std::endl; delete data; data = other.data; other.data = nullptr; } return *this; } // 析构函数 ~MyClass() { std::cout << "Destructor called" << std::endl; delete data; } private: int* data = new int(0); };
std::move
转换右值:MyClass a; MyClass b = std::move(a); // 调用移动构造函数
std::forward
保留参数原来的值类别(左值或右值):template <typename T> void wrapper(T&& arg) { MyClass obj = std::forward<T>(arg); // 保留参数原来的值类别 }
std::move_iterator
和 std::back_inserter
提高容器性能:std::vector<int> vec = {1, 2, 3, 4, 5}; std::vector<int> vec2; // 使用移动迭代器将 vec 中的元素移动到 vec2 中 std::move_iterator<std::vector<int>::iterator> it(vec.begin()); std::move_iterator<std::vector<int>::iterator> end(vec.end()); std::copy(it, end, std::back_inserter(vec2));
这些示例展示了如何在 C++ 中使用右值引用以提高程序性能。注意,在使用右值引用时,要确保正确处理资源管理,避免内存泄漏。