C++学习——拷贝构造函数和移动构造函数
生活随笔
收集整理的這篇文章主要介紹了
C++学习——拷贝构造函数和移动构造函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.拷貝構造函數
- 2.移動構造函數
1.拷貝構造函數
拷貝構造函數,它是一種特殊的構造函數。它的作用就是用一個已經生成的對象來初始化另一個同類的對象。
當類中擁有指針類型的成員變量時,拷貝構造函數中需要以深拷貝(而非淺拷貝)的方式復制該指針成員。
淺復制僅僅是指向被復制的內存地址,如果原地址中對象被改變了,那么淺復制出來的對象也會相應改變。深復制在計算機中開辟了一塊新的內存地址用于存放復制的對象。
淺層復制之所以危險,是因為兩個指針共同指向一片內存空間,若第一個指針將其釋放,另一個指針的指向就不合法了。
深拷貝:
#include<iostream> using namespace std;class base { public:base(int value1,int value2) :p(new int),num(value2) {*p = value1;}base(const base& b) :p(new int), num(b.num) {*p = *(b.p);}//深拷貝/*base(const base& b) :p(b.p), num(b.num) {}//淺拷貝*/void print() {cout << "*p=" << *p << " num=" << num << endl;}~base() {delete p;} private:int* p;int num; };int main() {base b1(10, 20);b1.print();base b2(b1);b2.print();return 0; } *p=10 num=20 *p=10 num=20淺拷貝:
#include<iostream> using namespace std;class base { public:base(int value1,int value2) :p(new int),num(value2) {*p = value1;}/*base(const base& b) :p(new int), num(b.num) {*p = *(b.p);}//深拷貝*/base(const base& b) :p(b.p), num(b.num) {}//淺拷貝void print() {cout << "*p=" << *p << " num=" << num << endl;}~base() {delete p;} private:int* p;int num; };int main() {base b1(10, 20);b1.print();base b2(b1);b2.print();return 0; }2.移動構造函數
所謂移動語義,指的就是以移動而非深拷貝的方式初始化含有指針成員的類對象。簡單的理解,移動語義指的就是將其他對象(通常是臨時對象)擁有的內存資源“移為已用”。
拷貝構造函數中,對于指針,我們一定要采用深層復制,而移動構造函數中,對于指針,我們采用淺層復制。
移動構造函數的參數和拷貝構造函數不同,拷貝構造函數的參數是一個左值引用,但是移動構造函數的初值是一個右值引用。意味著,移動構造函數的參數是一個右值或者將亡值的引用。也就是說,只用用一個右值,或者將亡值初始化另一個對象的時候,才會調用移動構造函數。而那個move語句,就是將一個左值變成一個將亡值。
#include<iostream> using namespace std;class base { public:base(int value1,int value2) :p(new int),num(value2) {*p = value1;}/*base(const base& b) :p(new int), num(b.num) {*p = *(b.p);}//深拷貝,拷貝構造函數*/base(base& b) :p(b.p), num(b.num) {b.p = NULL;}//移動構造函數void print() {cout << "*p=" << *p << " num=" << num << endl;}~base() {delete p;} private:int* p;int num; };int main() {base b1(10, 20);b1.print();base b2(b1);b2.print();return 0; } *p=10 num=20 *p=10 num=20總結
以上是生活随笔為你收集整理的C++学习——拷贝构造函数和移动构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人觉得好的文章链接推荐【转载,侵权立删
- 下一篇: [导入]ASP.NET 配置节架构