QImage的淺拷貝與深拷貝

2021-08-20 17:18:33 字數 1185 閱讀 7828

首先簡單說說什麼是淺拷貝和深拷貝:淺拷貝就比如像引用型別,而深拷貝就比如值型別,即淺拷貝是共用一塊記憶體的,而深拷貝是複製乙份內容。

我們再來看看qimage類的幾個建構函式:

// 淺拷貝

qimage(uchar * data, int width, int height, format format)

// 淺拷貝

qimage(const uchar * data, int width, int height, format format)

// 淺拷貝

qimage(uchar * data, int width, int height, int bytesperline, format format)

// 淺拷貝

qimage(const uchar * data, int width, int height, int bytesperline, format format)

// 深拷貝

qimage qimage::copy(const qrect & rectangle = qrect()) const

// 淺拷貝

從建構函式可以得知只要知道:

·指向影象資料的uchar*型位址

·影象寬度

·影象高度

·影象格式或者是影象的每行位元組數(通道*寬度)

那麼就可以構造出乙個qimage的實體,而這裡討論的是,這個實體是與傳入建構函式的影象資料位址指向的記憶體塊是同一塊記憶體,即淺拷貝。其實在opencv的mat類構造也是如此,類似的還有qt中的qpixmap。

// 拷貝建構函式,深拷貝

qpixmap::qpixmap(const qpixmap & pixmap)

// 淺拷貝

qpixmap & qpixmap::operator=(const qpixmap & pixmap)

// 深拷貝

qpixmap qpixmap::copy(const qrect & rectangle = qrect()) const

最後,可以去做個實驗來驗證,讀取指定大小的一張影象到開闢好的記憶體塊databuffer中–>通過這個記憶體塊和影象相關資訊構造乙個qimage實體qimg–>顯示qimg–>將databuffer清空(memset)–>顯示qimg ,來判斷qimage的構造行數是否是深/淺拷貝。

參考:

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...