建立乙個物件時,常常需要作某些初始化的工作,例如對資料成員賦初值。注意,類的資料成員是不能在宣告類時初始化的。
原因:類相當於乙個模板,是一種新資料型別,而非變數,當程式宣告乙個類,未申
請儲存空間,只有當這個類定義物件時才申請空間
為了解決這個問題,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 賦值 當類成員...