(c++常问问题十六)移动构造函数

今天我们来讲讲c++11中引入了两个新东西

1.move constructor(移动构造函数)

2.move assignment(移动赋值)

 

Rule of three现在变成了Rule of five(多了上面说的两个东东)

class rule_of_five
{
    char* cstring; // raw pointer used as a handle to a dynamically-allocated memory block
 public:
    rule_of_five(const char* arg)
    : cstring(new char[std::strlen(arg)+1]) // allocate
    {
        std::strcpy(cstring, arg); // populate
    }
    ~rule_of_five()
    {
        delete[] cstring;  // deallocate
    }
    rule_of_five(const rule_of_five& other) // copy constructor
    {
        cstring = new char[std::strlen(other.cstring) + 1];
        std::strcpy(cstring, other.cstring);
    }
    rule_of_five(rule_of_five&& other) : cstring(other.cstring) // move constructor
    {
        other.cstring = nullptr;
    }
    rule_of_five& operator=(const rule_of_five& other) // copy assignment
    {
        char* tmp_cstring = new char[std::strlen(other.cstring) + 1];
        std::strcpy(tmp_cstring, other.cstring);
        delete[] cstring;
        cstring = tmp_cstring;
        return *this;
    }
    rule_of_five& operator=(rule_of_five&& other) // move assignment
    {
        delete[] cstring;
        cstring = other.cstring;
        other.cstring = nullptr;
        return *this;
    }

 

那么新加入的移动赋值以及移动拷贝要怎么使用呢,直接看代码

#include <iostream>
#include <utility>
#include <vector>
#include <string>
int main()
{
    std::string str = "Hello";
    std::vector<std::string> v;
 
    // uses the push_back(const T&) overload, which means 
    // we'll incur the cost of copying str
    v.push_back(str);
    std::cout << "After copy, str is \"" << str << "\"\n";
 
    // uses the rvalue reference push_back(T&&) overload, 
    // which means no strings will copied; instead, the contents
    // of str will be moved into the vector.  This is less
    // expensive, but also means str might now be empty.
    v.push_back(std::move(str));
    std::cout << "After move, str is \"" << str << "\"\n";
 
    std::cout << "The contents of the vector are \"" << v[0]
                                         << "\", \"" << v[1] << "\"\n";
}

Output:

After copy, str is "Hello"
After move, str is ""
The contents of the vector are "Hello", "Hello"

看完大概明白一点儿了,加上move之后,str对象里面的内容被"移动"到新的对象中并插入到数组之中了,同时str被清空了。这样一来省去了对象拷贝的过程。所以说在str对象不再使用的情况下,这种做法的效率更高一些!

转载于:https://www.cnblogs.com/JensenCat/p/5190692.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的字符串赋值函数、移动赋值函数和移动构造函数分别是: 1. 字符串赋值函数(Assignment Operator):在C++中,可以使用赋值操作符(=)来将一个字符串赋值给另一个字符串。例如: ```cpp std::string str1 = "Hello"; std::string str2; str2 = str1; // 使用赋值操作符将str1的值赋给str2 ``` 这里,使用赋值操作符将str1的值赋给str2。 2. 移动赋值函数(Move Assignment Operator):移动赋值函数用于在性能上优化对象的赋值过程,通过移动资源而不是进行深拷贝。它使用`&&`来接收右值引用参数。例如: ```cpp class MyString { public: // 移动赋值函数 MyString& operator=(MyString&& other) noexcept { if (this != &other) { // 释放当前对象的资源 delete[] m_data; // 移动other的资源到当前对象 m_data = other.m_data; m_size = other.m_size; // 清空other对象 other.m_data = nullptr; other.m_size = 0; } return *this; } private: char* m_data; size_t m_size; }; ``` 这里,移动赋值函数通过移动`other`对象的资源到当前对象,并清空`other`对象。 3. 移动构造函数(Move Constructor):移动构造函数用于在性能上优化对象的构造过程,通过移动资源而不是进行深拷贝。它使用`&&`来接收右值引用参数。例如: ```cpp class MyString { public: // 移动构造函数 MyString(MyString&& other) noexcept { m_data = other.m_data; m_size = other.m_size; other.m_data = nullptr; other.m_size = 0; } private: char* m_data; size_t m_size; }; ``` 这里,移动构造函数通过移动`other`对象的资源到当前对象,并清空`other`对象。 需要注意的是,移动赋值函数和移动构造函数一般需要保证不抛出异常,因此通常使用`noexcept`关键字声明它们。另外,移动赋值函数和移动构造函数通常与移动语义相关的类一起使用,如智能指针、容器等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值