1. 程式人生 > >對深淺拷貝的一點認識

對深淺拷貝的一點認識

C++初學—拷貝建構函式—深淺拷貝—簡單認識

這學期開了C++課程,上課不認真聽課的我,選擇敲下老師課件中所有程式碼來學習,到建構函式模組認識了有個叫做“拷貝建構函式”的東西,其中深淺拷貝令我感到困惑,在上網查閱了相關資料以及讀過各博主的博文之後,有感想體會如下,以供日後查缺補漏。

  重所周知的拷貝建構函式(複製建構函式)有三個用途:
      1、一個物件作為函式引數,以值傳遞的方式傳入函式體;
      2、一個物件作為函式返回值,以值傳遞的方式從函式返回;
      3、一個物件用於給另一個物件進行初始化(賦值初始化)。
  拷貝建構函式的格式為:
      類名 ( const 類名 & 物件名 ){......}

因為如果我們不在程式中自己定義拷貝建構函式的話,編譯器會自動為我們生成一個預設的拷貝建構函式,這個拷貝建構函式的功能很簡單:在物件之間進行簡單的值傳遞。(這也就是所說的“淺拷貝”)
所以我覺著一般情況下可以不寫拷貝建構函式。
除非—>類中涉及動態成員。此時,應當自己定義拷貝建構函式,以免程式出錯。程式碼如下:

#include<iostream>

using namespace std; 

class Point{
private:
    int * p;    //私有指標成員,屬動態成員
public: 
    Point()     //建構函式
    {
        p = new
int; } ~Point() //解構函式 { delete p; } int * Get() //外部介面,返回私有的成員p { return p; } Point(Point &P) //拷貝建構函式 { p = new int; //此句為關鍵,保證程式程式輸出為10,此時為深拷貝 //若註釋掉此句,則程式輸出20,此時為淺拷貝 //而且因為有解構函式的存在,會重複釋放記憶體空間導致程式執行出錯
* p = *(P.Get()); //注意這裡的賦值,是將P中p指向的記憶體空間的內容給當前類中的p //而不是直接p = P.p 也就是深淺的區別 } }; int main() { Point P1; //定義物件P1 *(P1.Get()) = 10; //為物件P1中的指標指向的記憶體空間賦值10 Point P2 = P1; //定義物件P2,並呼叫拷貝建構函式 cout << *(P1.Get()) << endl; *(P2.Get()) = 20; //為P2中的指標指向的記憶體空間賦值20(淺拷貝時,P2和P1的指標均指向同一記憶體) cout << *(P1.Get()) << endl; return 0; }

執行程式不難發現,淺拷貝時,P2的成員p並沒有指向新的記憶體空間,而是進行了簡單的指標賦值,而深拷貝時,是將P2的指標指向了新的記憶體單元,並對新的記憶體單元進行了賦值。

淺談轍止,僅供自己日後查缺補漏,希望論壇裡各位前輩能多指教

相關推薦

深淺拷貝一點認識

C++初學—拷貝建構函式—深淺拷貝—簡單認識 這學期開了C++課程,上課不認真聽課的我,選擇敲下老師課件中所有程式碼來學習,到建構函式模組認識了有個叫做“拷貝建構函式”的東西,其中深淺拷貝令我感到困惑,在上網查閱了相關資料以及讀過各博主的博文之後,有感想體會如

fragment的一點認識

fragment 更多 認識 nbsp 復用性 div 業務 多個 組件化 一切都是為了組件化和復用 View的可復用性導致View的設計不能承載更多視圖外的邏輯。Fragment可以承載多個View和一定的業務邏輯。Activity太重導致無法更細粒度的復用,卻可以承載

BFC的一點認識

caption image 分享圖片 sca gin open 單元格 name div 首先讓我復習一下塊級元素(block)和內聯元素(inline) 塊元素(block)的特點: block元素會獨占一行,多個block元素會各自新起一行。默認情況下,block元素

說說深淺拷貝的理解

說到深淺拷貝,那肯定要提到JavaScript的資料型別,先從資料型別說起。 JavaScript有兩種資料型別:基礎資料型別和引用資料型別。 基礎資料型別又有以下幾種: null 、undefined、number、string、Boolean; 引用資料型別包括:o

嵌入式的一點認識

有人說嵌入式是啥,不就是微控制器麼。嵌入式還真沒這麼“膚淺”,下面是我瞭解的一些關於嵌入式的知識。 嵌入式是什麼,簡單來說,嵌入式是在已有的硬體平臺上移植作業系統。那麼問題又來了,為什麼要移植作業系統呢?根據我所學的知識,我覺得有以下幾點好處: 1.提高軟體的移植性。傳統微

Final的一點認識

對Final的一點認識在程式設計的過程中,我們總是會遇到final關鍵字,那麼我們對final怎麼理解呢,下面是我的一點粗淺認識,和大家共享。package zy.pro.jbd.demo;public

readResolve的一點認識

      最近看effecitve java 2中有一段關於readResolve的使用,經過上網查閱資料得到以下總結:       我們知道java 物件的序列化操作是實現Serializable介面,我們就可以把它往記憶體地寫再從記憶體裡讀出而"組裝"成一個跟原來一模

maven的一點認識

使用maven好處: 在maven最普通的應用是在jar的管理上,這樣最明顯的好處是讓jar 和source分開,jar放置私服的maven倉庫,source放置SVN. 從SVN匯出專案原始碼時就只有source 了,這樣可以少佔有網路資源(從SVN匯出專案時會很快),同時

Cookie的一點認識

1. Cookie是怎麼在伺服器和瀏覽器之間傳遞的?(以Tomcat為參考) response.addCookie()將cookie寫到客戶端 request.getCookies()獲取瀏覽器端的cookie 但底層是怎麼實現的?檢視一下Tomcat的原始碼得知: 原來是把

ContentProvider的一點認識

1、ContentProvider 是android的四大元件之一,作用是對外共享資料,就是把自已應用程式裡的資料分享給其他應用程式,其他應用可以通過ContentProvider對你應用中的資料進行添刪改查。使用ContentProvider對外共享資料

抽象類和接口的一點認識

數據共享 父類 標識 常量 詳細 class 抽象層 span 必須 假設一個非抽象子類繼承一個抽象父類,它必須實現父類中的抽象方法,假設子類也是抽象類,那麽則不必實現父類中的抽象方法。 假設一個類實現了一個接口。那麽必須實現接口中的全部方法。可是子類是抽象類則不用。

js通過一個方法實現象的深淺拷貝

str else xtend color extend log typeof ror defined 眾所周知,對象的深淺拷貝是工作中肯定會遇到的問題。所以,今天考慮寫個小的功能來記錄一下 //type:boolean,true-deep,true為深拷貝, functi

寫一下自己《統計學習方法》的一點認識

決策 kmeans 統計學習方法 回歸 增加 imp 方法 樸素貝葉斯 -- 一提到機器學習,就不得不提李航的這本《統計學習方法》,回家這幾日,把這本書的前九章看完了,因為後面兩章HMM和CRF在之前就已經看過了,簡單寫一下自己的一點新認識。 這本書基本上是在圍繞有監督

Java中List<E>象賦值問題(深淺拷貝

不能 沒有 add size for .get one util contains Java中List<E>對象賦值操作問題 業務需求是:取2個集合中的交集對象並返回。如下代碼,busMap中key值和stocks中Map中的key值相等的對象則返回繼續操作,

js象的深淺拷貝

-c spa stringify == src alt bsp 特性 das JS數據類型可以分為(ES5,暫時不考慮ES6):   簡單數據類型:Number、String、undefined、boolean   復雜數據類型:Object、Array 簡單的數據類型,往

分而治之演算法的一點認識

其實就是把打的問題轉化為小的問題,小的問題解決了打的問題自然就解決了,這一聽就像是遞迴,沒錯就是遞迴。比較經典的有:漢諾塔,八皇后,歸併排序了,等等。我就不列出程式碼了,網上多的是。關鍵是將大的問題轉化為小的問題,這種思想。其實再將問題分解以後,小的物件面臨的問題的本質和大的物件面臨問題的本質是一樣的。只是數

生信與計算生物的一點認識[轉載]

轉自:https://baike.baidu.com/tashuo/browse/content?id=4ca32cfeca217b053440f64e&lemmaId=&fromLemmaModule=pcBottom 1.數學將重塑生物學  引入統計和資料分析。例子:如何理解

軟體一點認識.

微軟認為軟體就是一種服務. 我認為軟體是一種讓我們怎樣更好的使用工具的思路和方法.更是解決複雜問題的解決方案(凡是邏輯能完成的問題). 史學家講人與動物的區別在於會使用工具.比如,語言..語言是種抽象化的工具.而現代的工具的到來(比如計算機等各種電子工具),也帶來一個問題就是

虛擬函式動態繫結的一點認識

因為行內函數常常可以提高程式碼執行的速度,因此很多普通函式會根據情況進行內聯化,但是虛擬函式無法利用內聯化的優勢,這是因為行內函數是在“編譯期”編譯器將呼叫行內函數的地方用行內函數體的程式碼代替(內聯展開),但是虛擬函式本質上是“執行期”行為,本質上在“編譯期”編譯器無法知道某處的虛擬函式呼叫在真正執行的時候

c&c++原始檔和標頭檔案分開的好處的一點認識

對c&c++程式來說,基本上來說都是要把原始檔和標頭檔案分別編寫。一般都是代表一個基本功能的原始檔引用相應的標頭檔案。一個 相關功能的模組可能有若干對原始檔和標頭檔案組成。這是基於元件程式設計的核心。在我看來,他的好處是巨大的,是java不可比擬的,也是不可複製的:c