初遇C 拷貝建構函式

2021-10-03 06:10:43 字數 1275 閱讀 4184

拷貝建構函式作用:用乙個已存在的物件來初始化乙個正在建立的新物件。拷貝建構函式有以下特徵:

拷貝建構函式名與類名相同,形參只有乙個,是物件的引用,所以不能過載拷貝建構函式,拷貝建構函式原形為:《類名》(《類名》&物件名);

拷貝建構函式無任何函式返回型別說明;

若類宣告中無拷貝建構函式,系統會自動給出乙個預設的拷貝建構函式,該拷貝建構函式只進行物件資料成員間的對位拷貝,即所謂的「淺拷貝」;

某些情況下,使用者必須在類定義中給出乙個顯示的拷貝建構函式,以實現使用者指定的用乙個物件初始化另乙個物件的功能,即所謂的「深拷貝」;

以下三種情況,系統會自動呼叫拷貝建構函式:

(1)當使用下面的宣告語句,用乙個已存在的物件初始化乙個新物件時,系統會自動呼叫拷貝建構函式:

《類名》《新物件名》(《已存在物件名》);

或 《類名》《新物件名》=《已存在物件名》;

(2)物件作為實參,在函式呼叫開始進行實參和形參結合時,會自動呼叫拷貝建構函式,完成由已知的實參物件初始化形參新物件的功能;

(3)如果函式的返回值是類的物件,在函式呼叫完成返回時,系統自動呼叫拷貝建構函式,用return後面的已知物件來初始化乙個臨時新物件(所建立的臨時物件只在外部表示式範圍內有效,表示式結束時,系統將自動呼叫析構函式撤銷該臨時物件)。

**例如:**在主函式中需要用乙個已知的intarray類物件來初始化乙個新的intarray類物件,直接用系統提供的預設拷貝建構函式會出現問題(兩個物件指向乙個記憶體空間,系統**記憶體空間時會出現報錯)以及解決方法如下:

#include

using

namespace std;

class

intarray

intarray()

void

displayarraysize()

~intarray()

intarray

(intarray &x)

//拷貝建構函式

private

:int m_size;

int*m_ptr;

//整型指標在用之前需要給他分配乙個記憶體空間,分配記憶體空間之後把 分配記憶體空間首位址賦給m_ptr };

intmain()

關於上述程式的理解:

1、淺拷貝的記憶體空間只有乙個,在y中被析構函式銷毀後繼續釋放x的記憶體空間就會出現錯誤 。

2、如果乙個類中沒有指標成員變數的話,一般用淺拷貝就可以了,如果乙個類中有指標成員變數的話,一般需要定義乙個拷貝建構函式實現深拷貝 。

初遇建構函式

在翻劉汝佳的紫書的時候看見一種奇怪的結構體寫法 struct edge 這裡有兩個奇怪的東西 1.edge int u,int v,int d 結構體裡面套了乙個什麼玩意?2.from u to v dist d 這是什麼打法?問了下餘翱,第乙個是建構函式,可以在main裡面呼叫從而快速賦值。例如....

初遇C語言

壹 知識總結 第二章 c資料型別 1 int定義整數量 float定義單精度浮點數量 double定義雙精度浮點數量 char定義字元型量。2 讀程式都要從main 入口,然後從最上面順序往下讀 碰到迴圈做迴圈,碰到選擇做選擇 有且只有乙個main函式。3 注釋不可以巢狀,如int a 1,int ...

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...