C 物件導向程式設計(二)之 深拷貝和淺拷貝

2021-07-04 00:06:43 字數 2695 閱讀 9394

拷貝建構函式的深淺拷貝詳解

預設拷貝建構函式可以完成物件的資料成員值簡單的複製。

物件的資料資源是有指標指示的堆時,預設拷貝建構函式僅作指標值複製。

而淺拷貝,在某些情況下,例如,當類的資料成員中有指標型別時,就會帶來資料安全方面的隱患,

我們就需要定義乙個特定的拷貝建構函式,該拷貝建構函式不僅可以實現原物件和新物件之間資料成員

的拷貝,而且可以為新的物件分配單獨的記憶體資源,這就是深拷貝建構函式。

自定義拷貝建構函式,進行深拷貝,即,各物件有各自的記憶體空間。

#include using namespace std;

class string

else

cout << "我是建構函式" << endl;

} //自定義拷貝建構函式,

string(const string& other)

string& operator=(const string &other)

delete m_data;//釋放原有的記憶體資源,防止記憶體洩露

length = strlen(other.m_data);

m_data = new char[length+1];

strcpy(m_data,other.m_data);

return *this;

} ~string()

cout << "我是析構函式" << endl;

}private:

char* m_data;

int length;

};void objmain()

int main()

看看 記憶體剖析圖

建構函式的初始化列表

c++中提供初始化列表對成員變數進行初始化

語法規則:

constructor::contructor() : m1(v1), m2(v1,v2), m3(v3)

// some other assignment operation

具體呼叫順序,先執行 類物件 的建構函式,如果 類物件有多個,按照宣告順序執行,

而不是按照初始化列表的順序。 析構函式與建構函式執行順序相反。

new delete  和 malloc free 的聯絡和區別

相同點:都是在堆上進行動態的記憶體操作。

不同點:new 和delete 是運算子,不是函式,因此執行效率高。

而malloc 和free 是函式,並且用malloc函式需要指定記憶體分配的位元組數,且不能

初始化物件。

new會自動呼叫物件的建構函式,delete會自動呼叫物件的析構函式。

用new分配陣列空間時,不能指定初值。如果由於記憶體不足等原因而無法正常分配空間。

則new會返回乙個空指標(null),使用者可以根據該指標的值判斷分配空間是否成功。

c++中的靜態成員變數和靜態成員函式

static關鍵字的作用:

函式體內

的static變數的作用範圍為該

函式體該變數的記憶體只被分配一次

在模組內的

static的全域性變數可以被模組內的所有函式呼叫,但不能被模組外其他函式訪問。

類中的static成員變數

屬於整個類所擁有,對類的所有物件只有乙份拷貝。

在模組內的static函式只可被該模組內的其他函式呼叫。

類中的static成員函式屬於整個類所擁有,

這個函式不接受this指標,因而只能訪問類的static成員變數。

c++物件導向模型:

語言中直接支援物件導向程式設計的部分,主要涉及如建構函式,析構函式,虛函式,繼承

(單繼承,多繼承,虛繼承,多型)等等。

對於各種支援的底層實現機制。

概況的說,在c++類中有兩種成員變數:靜態成員變數,和非靜態成員變數;三種成員函式:

靜態成員函式,非靜態成員函式,虛函式。 如圖:

c++類物件中的成員變數和成員函式時分開儲存的。

成員變數:

普通成員變數:儲存在物件中,與struct變數有相同的記憶體布局和位元組對齊方式

靜態成員變數:儲存於全域性資料區。

成員函式:儲存在**段中。

由上圖可以看出:

c++中類的普通成員函式都隱式包含乙個指向當前物件的this指標。

而靜態成員函式不包含指向具體物件的this指標。

C 物件導向 6 深拷貝和淺拷貝

前面一直在學習建構函式,其中拷貝構造我們帶出了值傳遞,拷貝乙個物件等概念。這篇來學習一下c 的乙個非常容易面試遇到的問題,也就是學習過程中的乙個坑。什麼是淺拷貝和深拷貝,兩者的區別是什麼。淺拷貝 簡單的賦值拷貝操作 前面我們學習的拷貝建構函式就是淺拷貝 根據前面的 我們把point換成person類...

Js 物件導向 淺拷貝和深拷貝

淺拷貝只是拷貝一層,更深層次物件級別的只拷貝引用 深拷貝拷多層,每一級別的資料都會拷貝 object.assign target,sources es6 新增方法可以淺拷貝 淺拷貝原始碼 doctype html en utf 8 viewport content width device widt...

vue物件深拷貝 vue陷阱 深拷貝vs淺拷貝

案例重現 看下面的乙個例子 data this.info m this.info.attr1 8 console.log m 這是vue的部分 我們猜測m會輸出什麼,你會驚奇的發現m會和this.info繫結,也就是對this.info.attr1的修改,會導致m的值變化,控制台輸出的結果是 att...