拷貝建構函式的深淺拷貝詳解
預設拷貝建構函式可以完成物件的資料成員值簡單的複製。
物件的資料資源是有指標指示的堆時,預設拷貝建構函式僅作指標值複製。
而淺拷貝,在某些情況下,例如,當類的資料成員中有指標型別時,就會帶來資料安全方面的隱患,
我們就需要定義乙個特定的拷貝建構函式,該拷貝建構函式不僅可以實現原物件和新物件之間資料成員
的拷貝,而且可以為新的物件分配單獨的記憶體資源,這就是深拷貝建構函式。
自定義拷貝建構函式,進行深拷貝,即,各物件有各自的記憶體空間。
#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...