C++11 |
您所在的位置:网站首页 › move什么意思呢 › C++11 |
复制构造和移动构造
复制构造是这样的: 在对象被复制后临时对象和复制构造的对象各自占有不同的同样大小的堆内存,就是一个副本。 什么时候该触发移动构造呢? 如果临时对象即将消亡,并且它里面的资源是需要被再利用的,这个时候我们就可以触发移动构造。 std::movestd::move函数可以以非常简单的方式将左值转换为右值引用。 通过std::move,可以避免不必要的拷贝操作。 std::move是为性能而生。 int main() { string str = "Hello";//这里假设我们只需要将str的内容放到vector中,完成以后永远都不需要再用到str vector v; //调用常规的拷贝构造函数,新建字符数组,拷贝数据 v.push_back(str); cout 1, 2, 3, 4 }; v1 = move(v2); //从v2转移到v1 //v1=={1, 2, 3, 4} system("pause"); return 0; }s1 = move(s2);move函数先把s2转为右值引用,然后就可以执行string类的移动构造函数和移动赋值运算符函数。 继续深入分析C++11的右值引用:1.什么是左值,什么是右值,简单说左值可以赋值,右值不可以赋值。以下面代码为例,“ A a = getA();”该语句中a是左值,getA()的返回值是右值。 class A { public: A() { cout } }; A getA() { A a; return a; } int main() { A a = getA();// getA()是一个右值 system("pause"); return 0; }
2.自定义A的移动构造函数,代码如下: class A { public: A() { cout cout A a; return a; } int main() { A a = getA();// getA()是一个右值 system("pause"); return 0; }
3.修改代码,给A类添加一个成员变量如下: class B { public: B() {} B(const B&) { cout cout src.pb = nullptr;//这里是关键,这样以后,当src.pb被delete时,由于其为空指针,并不会释放原来的堆内存 cout A a; cout public: B() {} B(const B&) { cout cout src.pb = nullptr; cout A a; cout public: B() {} B(const B&) { cout cout src.pb = nullptr; cout if (this == &src) return *this; delete pb; pb = src.pb; src.pb = nullptr; cout A a; cout int*p1 = new int(56); unique_ptr up_int1(p1); unique_ptr up_int2= move(up_int1);//转交所有权(法1) //unique_ptr p2(p1.release()); //转交所有权(法2) string* p2 = new string[2];//对象数组 p2[0] = "apple"; p2[1] = "banana"; unique_ptr up_str1(p2); unique_ptr up_str2; up_str2 = move(up_str1); system("pause"); return 0; } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |