国产探花免费观看_亚洲丰满少妇自慰呻吟_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,又會出錯

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

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜南县| 屏南县| 泰来县| 太保市| 丰原市| 双柏县| 大足县| 延吉市| 招远市| 静海县| 舒兰市| 泰宁县| 虹口区| 淳安县| 肥城市| 宣城市| 赣榆县| 汽车| 冕宁县| 洛扎县| 松溪县| 和静县| 略阳县| 荆州市| 屏山县| 家居| 大城县| 浠水县| 定西市| 新河县| 雅安市| 定陶县| 高安市| 临颍县| 衡水市| 新泰市| 县级市| 屏东县| 同德县| 福贡县| 同德县|