C++移动构造函数如何与其他构造函数配合使用

avatar
作者
猴君
阅读量:0

在C++中,一个类可以有多个构造函数,这被称为构造函数的重载。移动构造函数是一种特殊的构造函数,它接受一个右值引用参数,并将该参数的资源移动到对象中,而不是复制资源。这可以提高性能,特别是对于大型对象或资源密集型对象。

要将移动构造函数与其他构造函数配合使用,可以使用C++11引入的std::move模板函数。std::move可以将左值转换为右值引用,从而使移动构造函数可以与其他构造函数配合使用。

以下是一个示例,演示了如何将移动构造函数与其他构造函数配合使用:

#include <iostream> #include <string> #include <utility>  class MyString { public:     // 默认构造函数     MyString() : data(nullptr), size(0) {}      // 参数化构造函数     MyString(const char* str) {         size = std::strlen(str);         data = new char[size + 1];         std::strcpy(data, str);     }      // 移动构造函数     MyString(MyString&& other) noexcept : data(other.data), size(other.size) {         other.data = nullptr;         other.size = 0;     }      // 析构函数     ~MyString() {         delete[] data;     }      // 赋值运算符     MyString& operator=(const MyString& other) {         if (this != &other) {             char* new_data = new char[other.size + 1];             std::strcpy(new_data, other.data);             delete[] data;             data = new_data;             size = other.size;         }         return *this;     }      // 移动赋值运算符     MyString& operator=(MyString&& other) noexcept {         if (this != &other) {             delete[] data;             data = other.data;             size = other.size;             other.data = nullptr;             other.size = 0;         }         return *this;     }      // 打印字符串     void print() const {         std::cout << data << std::endl;     }  private:     char* data;     size_t size; };  int main() {     MyString s1("Hello");     MyString s2 = std::move(s1);  // 使用移动构造函数     s1.print();  // 输出空字符串,因为s1的资源已被移动到s2     s2.print();  // 输出"Hello"     return 0; } 

在这个示例中,MyString类有四个构造函数:默认构造函数、参数化构造函数、移动构造函数和赋值运算符。默认构造函数创建一个空字符串,参数化构造函数接受一个C风格字符串并创建一个新的MyString对象,移动构造函数接受一个MyString对象并将其资源移动到新对象中,赋值运算符将一个MyString对象的资源复制到新对象中。

main函数中,我们首先创建了一个MyString对象s1,然后使用std::move将其移动到另一个MyString对象s2中。注意,移动后,s1的资源已被释放,因此其打印输出为空字符串。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!