C#、Java都沒有Copy Control,為什麼C++需要有Copy Control呢?

C++是個Hybrid語言,除了built-in type和Class type外,還有個其他語言都沒有的歷史產物:pointer,pointer的用途很多,其中一個用途是因為Dynamic Allocation,而且這種由Dynamic Allocation產生的pointer有幾個特點,第一就是他存的是Memory Address不是Data,所以Copy Constructor和Assignment Operator會有問題,第二就是須delete才會消失,不會隨著object out of scope而消失,有static的味道,所以必須自己在Destructor處理。C#、Java因為沒有pointer,因此不需手動處理Copy Constructor和Assignment Operator,但C#、Java雖有Garbage Collection,但C#仍有Destructor,主要是為了處理非Managed的Resource,如File Handler,Database Connection,但Java已經沒有Destructor了。

回到主題,C++的Copy Contructor和Assignment Operator有什麼問題呢?由Compiler所synthesized的程式,只會將pointer加以複製,很顯然最後指向的結果仍是同一份,這樣就沒有達到Copy的意義了,所以我們得自己重新定義Copy Constructor和Assignment Operator。至於Destructor,因為須手動delete,所以Destructor也必須重新定義。換言之,只要Data Member有用到pointer,也就是動態資料結構時,Copy Constructor、Assignment Operator、Destructor就必須重新定義。

以下範例Demo如何撰寫Copy Control處理單一動態資料和動態陣列。

  1}


執行結果

(原創) 為什麼C++須重新定義Copy Control? (C/C++)Constructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)
0
(原創) 為什麼C++須重新定義Copy Control? (C/C++)
0
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Constructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)
3
(原創) 為什麼C++須重新定義Copy Control? (C/C++)
3
(原創) 為什麼C++須重新定義Copy Control? (C/C++)
1
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Copy Constructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Copy Constructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Constructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Assign Operator
(原創) 為什麼C++須重新定義Copy Control? (C/C++)
2
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Destructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Destructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Destructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Destructor
(原創) 為什麼C++須重新定義Copy Control? (C/C++)Destructor

相关文章: