C 中的拷貝建構函式

2021-09-21 14:54:00 字數 738 閱讀 5242

今天在學習c++時看到了這樣一句話:

就好奇為什麼我們需要自己定義拷貝建構函式,以及 當我們自己定義拷貝建構函式後,「成員變數的逐個拷貝」 功能失效如何理解?

1)如果類只包含類型別成員和內建型別的成員,則可以不用顯示定義複製建構函式。

但如果類中包含有指標或者有分配其他型別資源時就必須重新定義複製建構函式。因為類中有指標成員,當把用乙個物件初始化另乙個物件時,這時兩個物件中的指標都指向同一段記憶體,這時如果其中乙個物件被消毀了,這時物件中指標所指向的記憶體也同樣被消毀,但另乙個物件確不知道這種情況,這時就會出現問題。

比如hyong類中含有乙個成員指標p,當宣告了hyong x=y其中y也是hyong類的物件,這時物件x和y中的指標成員p都指向同一段記憶體,而如果y被消毀,但x還沒被消毀時就會出問題,這時y中物件的成員指標p已經釋放了該記憶體資源,而x中的成員指標p還不知道已經釋放了該資源,這時就會出問題。因為物件x和y中的成員指標共享同一段記憶體,所以對y中的成員指標p的修改就會影響到物件x中的成員指標。

所有這些情況都需要重定義複製建構函式來顯示的初始化成員的值,這種初始化方式也被稱為深度複製。

參考資料:

在沒有動態分配記憶體的類中,確實沒有必要自己定義拷貝建構函式,但是因為系統預設建構函式是嚴格的按位拷貝。

當我們在類中宣告了動態分配記憶體的成員時(深拷貝),這是就會產生記憶體問題@!!!

C 中拷貝建構函式

拷貝建構函式主要需要考慮兩個問題 乙個是什麼時候會呼叫拷貝建構函式,另乙個是拷貝建構函式中的淺拷貝和深拷貝 問題1 1 物件在建立時使用其他的物件初始化 cstudent b a 此時複製建構函式被用來建立例項b cstudent c a 此時複製建構函式被用來在定義例項p時初始化c 2 物件作為函...

C 中的拷貝建構函式

在c 中,下面三種物件需要呼叫拷貝建構函式 1 乙個物件以值傳遞的方式傳入函式體 2 乙個物件以值傳遞的方式從函式返回 3 乙個物件需要通過另外乙個物件進行初始化 注意 1.如果不主動編寫拷貝建構函式和賦值函式,編譯器將以 位拷貝 的方式自動生成預設的函式。2.類中有指標型別的資料成員事就要呼叫自己...

C 中的拷貝建構函式

一 拷貝建構函式 格式 a const a a 總結 系統為物件b分配了記憶體並完成了與物件testa的複製過程,就類物件而言,相同型別的類物件是通過拷貝建構函式來完成整個複製過程的。1.拷貝建構函式的使用 a testa a b testa 2.析構的先後順序 程式結束,析構的時候,先析構了b,後...