物件的構造與析構

2021-10-03 05:18:52 字數 2178 閱讀 6495

建立乙個物件時,常常需要作某些初始化的工作,例如對資料成員賦初值。注意,類的資料成員是不能在宣告類時初始化的

原因:類相當於乙個模板,是一種新資料型別,而非變數,當程式宣告乙個類,未申

請儲存空間,只有當這個類定義物件時才申請空間

為了解決這個問題,c++編譯器提供了建構函式(constructor)來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,不需要使用者來呼叫它,而是在建立物件時自動執行。

有關建構函式

1建構函式定義

1)c++中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做建構函式;

2)建構函式在定義時可以有引數;

3)沒有任何返回型別的宣告。

2建構函式的呼叫

自動呼叫:一般情況下c++編譯器會自動呼叫建構函式

手動呼叫:在一些情況下則需要手工呼叫建構函式

有關析構函式

3析構函式定義與呼叫

1)c++中的類可以定義乙個特殊的成員函式清理物件,這個特殊的成員函式叫做析構函式

語法:~classname()

2)析構函式沒有引數也沒有任何返回型別的宣告

3)析構函式在物件銷毀時自動被呼叫

4)析構函式呼叫機制

c++編譯器自動呼叫
普通方案:

為每個類都提供乙個public的initialize函式;

物件建立後立即呼叫initialize函式進行初始化。

優缺點分析

1)initialize只是乙個普通的函式,必須顯示的呼叫

2)一旦由於失誤的原因,物件沒有初始化,那麼結果將是不確定的

沒有初始化的物件,其內部成員變數的值是不定的

3)不能完全解決問題

需要構造析構方案原因

1.類沒有寫建構函式,c++編譯器提供預設的建構函式

2.定義物件陣列時,沒有機會進行顯示初始化,需要乙個乙個初始化

test21 arr[3]

;//test arr_2[3] = ;

system

("pause");

return rv;

1無引數建構函式

呼叫方法: test t1, t2;
2 有參建構函式

有參建構函式的三種呼叫方法

test5 t1(10

);//c++編譯器預設呼叫有參建構函式 括號法

test5 t2 =(20

,10);

//c++編譯器預設呼叫有參建構函式 等號法

test5 t3 =

test5(30

);//程式設計師手工呼叫建構函式 產生了乙個物件 直接呼叫構造建構函式法

注意:物件的初始化和物件賦值不同
3 拷貝構造函式呼叫時機

賦值建構函式的四種呼叫場景(呼叫時機)

第1和第2個呼叫場景

/賦值建構函式的第乙個應用場景

//用物件1 初始化 物件2

aa a2 = a1;

//定義變數並初始化 //初始化法

a2 = a1;

//用a1來=號給a2 編譯器給我們提供的淺copy

//用物件1 初始化 物件2 

aa a2

(a1)

;//定義變數並初始化 //括號法

第3個呼叫場景

void f ( location  p )

void

mainobjplay()

第4個呼叫場景

返回乙個匿名物件,分配乙個記憶體,看後邊如何呼叫(初始化還是賦值)

void f ( location  p )

location g()

//物件初始化操作

和 =等號操作 是兩個不同的概念

//匿名物件的去和留,關鍵看,返回時如何接

void

mainobjplay()

構造 析構 物件與繼承

c 學習筆記之二 上一節講到了建構函式,這一節繼續講解。1 建構函式可以被過載,如 object object int object 這兩個函式是具有相同的函式名,而引數個數或引數型別不同,這就是過載。2 析構函式 特點 沒有返回值,以 打頭,且函式在物件銷毀時呼叫 即作用域結束時被呼叫 出了作用域...

物件的構造 析構 拷貝構造

這是一道外企的c 筆試題,要求寫出結果並分析 include class a void main a a 1 f a 1 3.當函式的返回值型別為類的物件的時候。例如 a f a a 1 return a 1 void main a a a f 當自己定義的類中沒有定義拷貝建構函式的時候,系統在需要...

C 多個物件構造 析構 構造和析構的順序

include 多個物件構造和析構 1 當類中有成員變數是其它類的物件時,首先呼叫成員變數的建構函式,呼叫順序與宣告順序相同 之後呼叫自身類的建構函式 2 析構函式的呼叫順序與對應的構造函式呼叫順序相反 2 類成員中若有const修飾,必須在物件初始化的時候,給const int n 賦值 當類成員...