程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++對象復制相關應用方式淺析

C++對象復制相關應用方式淺析

編輯:C++入門知識

C++編程語言的應用范圍非常廣泛,而且功能很強大,它能夠支持很多程序設計風格。其中就包括對面向對象的支持。在這裡我們將會為大家詳細介紹一下有關C++對象復制的應用方式,以幫助大家學習。

C++對象復制代碼示例:

  1. class Table{  
  2. Name * p;  
  3. size_t sz;  
  4. publish:  
  5. Table(size_t s = 15){p = new Name[ssz=s];}  
  6. ~Table(){delete[]p ;}  
  7. ......  
  8. }  
  9. void h()  
  10. {  
  11. Table t1;  
  12. Table t2 = t1;  
  13. Table t3;  
  14. t3 = t2;  

在h()結束時,默認構造函數調用了2次,而析構函數被調用了3次,為何?

  • C++標准類庫應用細節分析
  • C++ sizeof概念及應用方式探討
  • C++回文實現方法介紹
  • C++變量作用域使用注意事項
  • C++自定義類實際操作代碼淺析

Table t1; 調用1次默認構造函數

Table t2 = t1;默認的對象的賦值操作,按成員賦值,其中關於指針p,僅僅是將t1.p賦值給t2.p,即t2.p = t1.p,並無內存分配。對象t1和t2的p指針均指向同一塊內存。

Table t3; 調用1次默認構造函數

t3 = t2; 原t3.p指針被t2.p覆蓋,此時t3.p同樣指向對象t1和t2的p指針的同一塊內存。注意:t3原分配給p的內存由於沒有指針指向,無法利用,造成存儲浪費。

h()結束,對象t1,t2,t3的析構函數調用,此時對t1,t2,t3的指針p所指的同一塊存儲進行了三次刪除,非常危險,導致的結果是無發預料的,很可能災難性的。

因此明確定義類的復制構造函數(拷貝構造函數)和賦值預算可避免這樣的錯誤。

代碼

  1. Table::Table (const Table &t)  
  2. {  
  3. p = new Name[sz=t.sz];  
  4. for(int i=0;i<sz;i++) p[i]=t.p[i];  
  5. }  
  6. Table & Table::operator=(const Table &t)  
  7. {  
  8. if(this!=&t){  
  9. delete []p;  
  10. p = new Name[sz=t.sz];  
  11. for(int i=0;i<sz;i++) p[i]=t.p[i];  
  12. }  
  13. return *this;  

C++對象復制的基本概念就為大家介紹到這裡。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved