C 的堆與拷貝建構函式

2021-10-05 15:35:51 字數 1879 閱讀 7635

1.c++的記憶體劃分

(1)全域性資料區:存放全域性變數、常量、靜態資料

(2)**區:存放程式的**

(3)棧區:存放區域性變數、函式的引數、返回資料、返回位址等

(4)堆區(自由儲存區):作為其他操作的使用的資源

注意:當我們的程式new或者malloc申請到了一些堆記憶體時,在使用完之後務必**堆記憶體,否則會造成記憶體洩露!

2.malloc/free與new/delete

(1)用malloc/free來申請堆記憶體和**堆記憶體

class

student

;student

(char

* name,

int num)

char

*getname()

void

setname

(char

* name)

intgetnum()

void

setnum

(int num)

private

:char name[20]

;int num;};

void

main()

(2)兩者的區別

用new開闢堆記憶體會呼叫類的建構函式,但是用malloc開闢堆記憶體不會呼叫類的建構函式

1.建立堆物件和**堆記憶體

student* stu2 =

newstudent

("考拉啦"

,1003);

delete stu2;

2.建立堆物件陣列和**堆記憶體
//在堆建立乙個陣列長度為10的物件陣列

student* pstuarr =

new student[10]

;//**堆記憶體

//delete pstuarr; 也可

delete

pstuarr;

1.拷貝建構函式能做什麼?為什麼需要拷貝建構函式?

因為物件的型別多種多樣,不像基本資料型別這麼簡單,所以並不能像普通型別一樣直接拷貝,如:

int a=5;

int b=a;

//用a的值拷貝給新建的b

因此用乙個物件去初始化另乙個物件則需要用到拷貝建構函式

2.拷貝建構函式的使用

(1)在student類中加入如下**

student

(student& s)

(2)分析什麼情況下會呼叫拷貝建構函式

注意:拷貝建構函式與建構函式和析構函式相同,也具有預設的拷貝建構函式

3.淺拷貝與深拷貝

(1)淺拷貝的弊端

前文所述的拷貝建構函式就是一種淺拷貝,當乙個物件的成員指標指向的是堆記憶體時,把該物件用淺拷貝給另乙個物件初始化後,此時會出現的結果就是兩個物件的不同成員指標指向了同乙個堆記憶體!那麼這兩個物件析構後,同乙個堆記憶體就會釋放兩次導致程式崩潰。

#include

using

namespace std;

class

student

;student::

student

(char

*name,

int age)

//析構函式

student::

~student()

intmain()

(2)深拷貝

把類中的拷貝建構函式自定義為下列函式即可

student::

student

(const student &s)

C (一) 建構函式與拷貝建構函式

2.拷貝建構函式 類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,這些函式叫做建構函式。建構函式的任務是初始化類物件的資料成員。tip 建構函式不能宣告為const的。形式1 person 不帶任何引數,合成的預設建構函式就是該形式 合成預設建構函式初始化規則 1 如果存在類內的初始值,用它...

C 拷貝建構函式的深拷貝與淺拷貝

一 什麼時候呼叫拷貝建構函式 如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝。二 深拷貝和淺拷貝的區別 1.在未定義顯示拷貝建構函式的情況下,系統會呼叫預設的拷貝建構函式 即淺拷貝。當資料成員中沒有指標時,淺...

C 的建構函式與析構函式與拷貝建構函式

預設情況下,c 編譯器至少給乙個類新增3個函式 1 預設建構函式 無參,函式體為空 2 預設析構函式 無參,函式體為空 3 預設拷貝建構函式 系統預設生成的拷貝建構函式,只負責進行簡單的賦值操作,即淺拷貝 對屬性進行值拷貝 構造函式呼叫規則如下 1.建構函式的作用 初始化時建構函式就開始發揮作用 建...