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++ 中使用右值引用以提高程序性能。注意,在使用右值引用時,要確保正確處理資源管理,避免內存泄漏。