構造 析構 深拷貝和淺拷貝

2021-08-08 10:39:05 字數 2481 閱讀 1381

1. 類與物件的編譯原理

每個物件所占用的記憶體空間都等於類中全部資料成員所需記憶體空間的總和

多個同類物件共用同乙個函式,記憶體中只需要儲存乙份函式**

物件函式成員編譯時,編譯器會給函式成員的函式頭新增物件指標作為形參  類名* const this

2.物件的構造和析構

變數在記憶體的生存期

全域性變數:靜態分配的,程式開始立即分配,結束結束時釋放

區域性變數:動態分配的,定義的**塊內生效

靜態變數:靜態分配的,程式開始立即分配,結束結束時釋放

物件:全域性物件,區域性物件,靜態物件

建立物件的過程稱為物件的構造,銷毀物件的過程稱為析構。

構造個性化物件:初始化物件,申請額外的記憶體。

銷毀個性化記憶體:釋放額外申請的記憶體

建構函式:建構函式在被建立時自動呼叫,每建立乙個物件,建構函式被呼叫一次。

– 建構函式名必須與類名相同。

– 建構函式由計算機自動呼叫,程式設計師不能直接呼叫。

– 建構函式通過形參傳遞初始值(可指定預設形參值),實現對新建物件資料成員的初始化。

– 建構函式可以過載,即定義多個同名的建構函式,這樣可提供多種形式的物件構造方法。

– 建構函式可以定義成內聯函式。(定義在宣告處)

– 建構函式沒有返回值,定義時不能寫函式型別,寫void也不行。

– 建構函式通常是類外呼叫,其訪問許可權應設為public或protected,不能設為private。

– 乙個類如果沒有定義建構函式,編譯器在編譯時將自動新增乙個空的建構函式,稱為預設建構函式,

其形式為:類名( )

建構函式初始化物件:

circle :: circle( double x ) // 帶形參的建構函式

circle :: circle( ) // 不帶形參的建構函式

circle obj( 5.0 ); //引用第乙個

circle obj; //引用第二個

circle :: circle( double x = 0 )

用已存在的物件初始化當前的新物件,稱為拷貝建構函式:

circle :: circle( circle &obj )	//引用

circle obj1( 5.0 );

circle obj2( obj1 );

建構函式申請記憶體:

student(char *pname, char *pid, int iniage, double iniscore, char *pmemo)

}student obj( 「張三」, 「1400500001」, 19, 95, 「」 );

student obj( 「張三」, 「1400500001」, 19, 95, 「市級三好學生」 );

析構函式:

– 析構函式名必須為「~類名」。

– 析構函式由計算機自動呼叫,程式設計師不能直接呼叫。

– 析構函式沒有形參。

– 析構函式沒有返回值,定義時不能寫函式型別,寫void也不行。

– 乙個類只能有乙個析構函式。

– 析構函式通常是類外呼叫,其訪問許可權應設為public或protected,不能設為private。

– 乙個類如果沒有定義析構函式,編譯器在編譯時將自動新增乙個空的析構函式,稱為預設析構函式,其形式為:~類名( )

析構函式

– 清理記憶體

– 設定與當前物件相關的系統狀態

~student( )

拷貝建構函式的深拷貝和淺拷貝

student(char *pname, char *pid, int iniage, double iniscore, char *pmemo)

}student obj1( 「張三」, 「1400500001」, 19, 95, 「市級三好學生」 );

student obj2( obj1 ); // 將自動呼叫預設拷貝建構函式

//預設的拷貝建構函式

student( student &obj )

深拷貝:需要自定義拷貝建構函式(析構釋放)

student( student &obj )

} 定義物件:

class student // 定義乙個學生資訊類student

};

定義物件:

student student1;

student *student = new student();

//不可以用

student student(a,b);

student student2(student1);		//拷貝
obj.fun()會被編譯成fun(&obj)

最後當類成員中有指標成員時,要新增拷貝建構函式。

拷貝建構函式淺拷貝深拷貝

1 函式的引數為類物件且引數採用值傳遞方式 2 將類物件做為函式的返回值。2.淺拷貝 所謂淺拷貝,指的是在物件複製時,只對物件中的資料成員進行簡單的賦值 預設拷貝建構函式執行的也是淺拷貝。大多情況下 淺拷貝 已經能很好地 工作了,但是一旦物件存在了動態成員,那麼淺拷貝就會出問題了,讓我們考慮如下一段...

拷貝建構函式,深拷貝,淺拷貝

深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件 新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。line line const line obj 深拷貝是在引用方...

拷貝構造 深拷貝與淺拷貝

拷貝建構函式用乙個已有同類物件的資料對正在建立的物件進行資料初始化 c 為類提供預設版本的拷貝建構函式 預設複製建構函式可以完成物件的資料成員值簡單的複製 物件的資料資源是由指標指示的堆時,預設複製建構函式僅作指標值複製,即為淺拷貝 class teachert 顯示的提供乙個拷貝建構函式,來完成深...