国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++對象的淺復制和深復制詳解及簡單實例

2020-05-23 13:47:52
字體:
來源:轉載
供稿:網友

C++對象的淺復制和深復制詳解及簡單實例

淺復制:兩個對象復制完成后共享某些資源(內存),其中一個對象的銷毀會影響另一個對象

深復制:兩個對象復制完成后不會共享任何資源,其中一個對象的銷毀不會影響另一個對象

下面我們來看一段代碼,以便直觀的理解:

#include<iostream> #include<string.h> using namespace std; class Student {   int no;   char *pname; public:   Student();   Student(int n,char* p);   ~Student();   void display(); };  Student::Student(){}  Student::Student(int n,char* p) {   no=n;   pname=new char[10];   strcpy(pname,p); }  Student::~Student() {   delete []pname; }  void Student::display() {   cout<<"學號:"<<no<<",姓名:"<<pname<<endl; }  void main() {   Student s(10,"xiaoming"),t;   t=s;   cout<<"s=";   s.display();   cout<<"t=";   t.display(); } 

這段程序看上去是正確的,但是執行就會出錯,原因就是復制語句t=s,此語句執行的復制是淺復制,s將pname指針指向的地址賦給s的pname,它們就會指向相同的內存空間,當t被析構時,t.pname所指的內存空間就被釋放了,再執行s的析構函數就會出錯。

如果采用深復制就可以避免這個問題,下面我們用運算符重載函數實現深復制:

Student& Student::operator = (Student& s) {   no=s.no;   int len=strlen(s.pname);   pname=new char[len+1];   strcpy(pname,s.pname);   return *this; } 

在執行t=s時,運算符重載函數內已為t分配內存空間。

對于上述運算符重載函數有兩點說明:

1.形參一定要是引用類型,否則執行t=s時,就要先將實參s復制到形參s,這個過程是淺復制,沒有為形參s分配內存空間,運行會出錯;

2.返回值一定要是引用類型,因為執行t=s相當于執行t.=(s),若返回值不是引用類型,那么還要將函數的返回對象復制到t,又會出錯

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴马| 汉阴县| 两当县| 沙河市| 台州市| 屯门区| 鄂托克旗| 邢台县| 晋江市| 满洲里市| 宜章县| 秦安县| 特克斯县| 贡山| 香格里拉县| 富顺县| 临夏市| 西平县| 古田县| 红桥区| 盐边县| 正宁县| 肥东县| 黑水县| 衡东县| 汤原县| 江川县| 原平市| 甘南县| 合作市| 富顺县| 开封县| 义马市| 福清市| 三明市| 桂平市| 紫云| 邓州市| 淮滨县| 延川县| 乌拉特后旗|