C++学习基础七——深复制与浅复制
生活随笔
收集整理的這篇文章主要介紹了
C++学习基础七——深复制与浅复制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++學習基礎(chǔ)七——深復(fù)制與淺復(fù)制
一、深復(fù)制與淺復(fù)制基本知識
深復(fù)制和淺復(fù)制,又稱為深拷貝和淺拷貝。 深復(fù)制和淺復(fù)制的區(qū)別如下圖1所示: 圖1 圖1表示的是,定義一個類CDemo,包含int a和char *str兩個成員變量, 當深復(fù)制時,A中的指針str與B中的指針str指向不同的地址,只是地址所指向的數(shù)據(jù)相同。 當淺復(fù)制時,A中的指針str與B中的指針str指向相同的地址。 ? 1.淺復(fù)制:如果我們自己不實現(xiàn)復(fù)制構(gòu)造函數(shù),則C++會自動合成一個復(fù)制構(gòu)造函數(shù),又稱為淺復(fù)制構(gòu)造函數(shù)。 2.深復(fù)制:如果使用指針或者系統(tǒng)資源(如數(shù)據(jù)庫,流對象等),則需要自己實現(xiàn)深復(fù)制的復(fù)制構(gòu)造函數(shù)。 3.深復(fù)制與淺復(fù)制的代碼區(qū)別: 1 Demo(const Demo &other) 2 { 3 this->id= other.id; 4 this->str = new char[1024];//深復(fù)制 ,該指針與 other內(nèi)的指針變量指向兩個不同的地址,只是數(shù)據(jù)相同 5 strcpy(this->str,other.str); 6 } 7 或者 8 Demo(const Demo &other) 9 { 10 this->id= other.id; 11 //深復(fù)制 ,該指針與 other內(nèi)的指針變量指向兩個不同的地址,只是數(shù)據(jù)相同 12 this->str = other.str; 13 } 14 Demo(const Demo &other) 15 { 16 this->id= other.id; 17 strcpy(this->str,other.str);//淺復(fù)制 18 } 4.如果自定義的類中包含指針,則應(yīng)該自己實現(xiàn)深復(fù)制的復(fù)制構(gòu)造函數(shù),賦值操作符和析構(gòu)函數(shù)。二、管理指針成員
淺復(fù)制時因為兩個指針指向相同的地址,很有可能出現(xiàn)野指針的情況; 深復(fù)制不會出現(xiàn)野指針,但會出現(xiàn)很多相同的對象,浪費內(nèi)存。 如何有效的使用指針成員呢?管理指針成員的三個方法如圖2所示: 圖2 三種方式的具體區(qū)別如圖3所示: 圖3 總結(jié):智能指針其實是淺復(fù)制,只是智能指針不會產(chǎn)生野指針,而淺復(fù)制會產(chǎn)生野指針。 1 #include <iostream> 2 3 using namespace std; 4 5 class ADemo 6 { 7 public: 8 ADemo(int v, const int &p) 9 { 10 val = v; 11 ptr = new int(p); 12 } 13 ~ADemo() 14 { 15 delete ptr; 16 } 17 18 ADemo(const ADemo &other) 19 { 20 val = other.val; 21 ptr = new int; 22 *ptr = *other.ptr;//深復(fù)制 23 } 24 25 ADemo& operator=(const ADemo &other) 26 { 27 val = other.val; 28 ptr = new int; 29 *ptr = *other.ptr;//深復(fù)制 30 return *this; 31 } 32 33 int get_ptr_val() 34 { 35 return *ptr; 36 } 37 void set_ptr(int v) 38 { 39 *ptr = v; 40 } 41 private: 42 int val; 43 int *ptr; 44 }; 45 46 class BDemo 47 { 48 public: 49 BDemo(int v, const int &p) 50 { 51 val = v; 52 ptr = new int(p); 53 } 54 ~BDemo() 55 { 56 delete ptr; 57 } 58 59 BDemo(const BDemo &other) 60 { 61 val = other.val; 62 ptr = other.ptr;//淺復(fù)制 63 } 64 65 BDemo& operator=(const BDemo &rig) 66 { 67 val = rig.val; 68 ptr = rig.ptr;//淺復(fù)制 69 return *this; 70 } 71 72 int get_ptr_val() 73 { 74 return *ptr; 75 } 76 void set_ptr(int v) 77 { 78 *ptr = v; 79 } 80 private: 81 int val; 82 int *ptr; 83 84 }; 85 86 //====================智能指針start============ 87 class U_Ptr 88 { 89 friend class CDemo; 90 private: 91 int *ptr; 92 size_t use; 93 U_Ptr(int *p,int u) 94 { 95 this->ptr = p; 96 use = u; 97 } 98 ~U_Ptr() 99 { 100 delete ptr; 101 } 102 } ; 103 104 class CDemo 105 {//智能指針 106 public: 107 CDemo(const int &p,int v) 108 { 109 ptr = new U_Ptr(new int(p),1); 110 val = v; 111 } 112 ~CDemo() 113 { 114 if(--ptr->use == 0)delete ptr; 115 } 116 117 CDemo(const CDemo &other) 118 { 119 ++ptr->use;//多了一個對象使用 120 val = other.val; 121 ptr = other.ptr;//淺復(fù)制 122 } 123 CDemo& operator=(const CDemo &rig) 124 { 125 ++rig.ptr->use; 126 if(--ptr->use == 0)delete ptr; 127 128 val = rig.val; 129 ptr = rig.ptr;//淺復(fù)制 130 return *this; 131 } 132 133 void set_Ptr_val(int v) 134 { 135 *ptr->ptr = v; 136 } 137 138 int get_ptr_val() 139 { 140 return *ptr->ptr; 141 } 142 private: 143 int val; 144 U_Ptr *ptr; 145 }; 146 147 void test_ShenCopy() 148 { 149 int prr = 20; 150 ADemo a(10,prr); 151 ADemo b = a; 152 cout<<"a = "<<a.get_ptr_val()<<endl; 153 cout<<"b = "<<b.get_ptr_val()<<endl; 154 cout<<"修改之后:"<<endl; 155 a.set_ptr(40); 156 cout<<"a = "<<a.get_ptr_val()<<endl; 157 cout<<"b = "<<b.get_ptr_val()<<endl; 158 } 159 void test_QianCopy() 160 { 161 162 int prr = 40; 163 BDemo a(50,prr); 164 BDemo b = a; 165 cout<<"a = "<<a.get_ptr_val()<<endl; 166 cout<<"b = "<<b.get_ptr_val()<<endl; 167 cout<<"修改之后:"<<endl; 168 b.set_ptr(80); 169 cout<<"a = "<<a.get_ptr_val()<<endl; 170 cout<<"b = "<<b.get_ptr_val()<<endl; 171 } 172 173 void test_smart() 174 { 175 int prr = 90; 176 CDemo a(100,prr); 177 CDemo b = a; 178 cout<<"a = "<<a.get_ptr_val()<<endl; 179 cout<<"b = "<<b.get_ptr_val()<<endl; 180 cout<<"修改之后:"<<endl; 181 b.set_Ptr_val(180); 182 cout<<"a = "<<a.get_ptr_val()<<endl; 183 cout<<"b = "<<b.get_ptr_val()<<endl; 184 } 185 int main() 186 { 187 cout<<"深復(fù)制:"<<endl; 188 test_ShenCopy(); 189 cout<<endl<<"淺復(fù)制:"<<endl; 190 test_QianCopy(); 191 cout<<endl<<"智能指針:"<<endl; 192 test_smart(); 193 return 0; 194 }?
posted on 2016-09-09 00:12 bky2016 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/calence/p/5855015.html
總結(jié)
以上是生活随笔為你收集整理的C++学习基础七——深复制与浅复制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Source insight 支持汇编
- 下一篇: Spring+SpringMVC+Myb