C (筆記)深淺拷貝and何時呼叫

2021-07-29 10:57:37 字數 1722 閱讀 3636

2、物件作為函式的引數進行值傳遞時

f(p); //此時p作為函式的引數進行值傳遞,p入棧時會呼叫複製建構函式建立乙個區域性物件,與函式內的區域性變數具有相同的作用域

需要注意的是,賦值並不會呼叫複製建構函式,賦值只是賦值運算子(過載)在起作用

p = q; //此時沒有複製建構函式的呼叫!(記住初始化和賦值的區別)

簡單來記的話就是,如果物件在宣告的同時將另乙個已存在的物件賦給它,就會呼叫複製建構函式;如果物件已經存在,然後將另乙個已存在的物件賦給它,呼叫的就是賦值運算子(過載)

1.在未定義顯示拷貝建構函式的情況下,系統會呼叫預設的拷貝函式–即淺拷貝,它能夠完成成員的一對一拷貝(逐位複製),當類中資料成員沒有指標時,利用淺拷貝完全沒問題的;但當資料成員中有指標時,如果採用簡單的淺拷貝,那麼兩個類中的兩個指標將會指向同一塊位址,當物件快結束時,會呼叫兩次析構器,從而導致指標懸掛現象,所以此時必須使用深拷貝

2.簡單來說,帶指標用深拷貝,不帶指標用淺拷貝

1.無指標的淺拷貝

2.有指標的淺拷貝

3.有指標的深拷貝

1.無指標的淺拷貝

class a

a(){}

private:

int data;

};int main()

解釋:b=a;就是淺拷貝,執行完b.data=5;如果物件中沒有其他資源(如:堆,檔案,系統資源),深淺無差。

2.有指標的淺拷貝(導致記憶體洩露)

class a

//給data分配size個記憶體

a(){}

~a()

//析構時釋放資源

private:

int *data;

int size;

};int main()

3.有指標的深拷貝,(解決上面的問題)物件另開闢一塊記憶體

class a

//給data分配size個記憶體

a(){}

a(const a&_a):size(_a.size)

//深拷貝

~a()

//析構時釋放資源

private:

int *data;

int size;

};int main()

**以上**就沒有問題了,與淺拷貝區別就是,在自己定義的拷貝函式裡另開闢一塊記憶體即深拷貝,

何時呼叫拷貝建構函式

拷貝建構函式是一種特殊的建構函式 拷貝建構函式是由編譯器呼叫,用來完成一系列基於同一類的其他物件的構件及初始化。拷貝建構函式的一般形式 類名 類名 變數名 函式體 拷貝建構函式的名稱必須和類名一致,形參必須是唯一的 不可改變的本型別的乙個引用型別的變數。拷貝構造函式呼叫的三種情況 物件以值傳遞的方式...

何時呼叫C 複製建構函式和拷貝建構函式

1.何時呼叫複製建構函式 複製建構函式用於將乙個物件複製到新建立的物件中。也就是說,它用於初始化過程中,而不是常規的賦值過程中。類的複製建構函式原型通常如下 class name const class name 它接受乙個指向類物件的常量引用作為引數。例如,string類的複製建構函式的原型如下 ...

C 中何時呼叫複製建構函式

在c 中,只有單個形參,而且該型別是對本類型別的引用 常用const修飾 這樣的建構函式稱為複製建構函式。複製建構函式既可以自己定義又可以像預設建構函式一樣被編譯器隱式呼叫。但大多數時候,特別是類中有指標成員的時候要實現深複製,避免淺複製時,就需要自己定義複製建構函式。那麼我們定義的複製建構函式什麼...