!為了解決這個問題,c++提供了建構函式(constructor)來處理物件的初始化。
不帶引數的建構函式:類名();
在函式體中對資料成員賦初值。這種方式使該類的每乙個物件都得到同一組初值。
帶引數的建構函式:類名(型別 1 形參1,型別2 形參2,…);
呼叫不同物件的建構函式時,從外面將不同的資料傳遞給建構函式,以實現不同的初始化。
用引數初始化表對資料成員初始化:不在函式體內對資料成員初始化,而是在函式首部實現。box∷box(int h,int w,int len):height(h),width(w),length(len)
只能用引數初始化列表初始化的情況!!!靜態資料成員不可以用這種方式初始化
預設建構函式(default constructor):呼叫建構函式時不必給出實參的建構函式。乙個類只能有乙個預設建構函式。
使用預設引數的建構函式:建構函式中引數的值指定為某些預設值,即如果使用者不指定實參值,編譯系統就使形參取預設值。
說明
析構函式:(destructor)當物件的生命期結束時,會自動執行析構函式,釋放資源,使這部分記憶體可以被程式分配給新物件使用。
析構函式不返回任何值,沒有函式型別,也沒有函式引數。因此它不能被過載。乙個類可以有多個建構函式,但只能有乙個析構函式。
析構函式的作用
呼叫建構函式和析構函式的順序
複製建構函式:見下面
轉換建構函式:當乙個建構函式只有乙個引數,而且該引數又不是本類的const引用時
物件陣列:陣列中每個元素是物件
物件指標
time t1,
*pt;
pt=&t1;
*pt pt所指向的物件,即t1。
(*pt)
.hour pt所指向的物件中的hour成員,即t1.hour
pt->hour pt所指向的物件中的hour成員,即t1.hour
指向物件 資料成員 的指標:和定義指向普通變數的指標變數方法相同。p1=&t1.hour; cout<<*p1<指向物件 成員函式 的指標:和定義指向普通函式的指標變數方法有所不同。
定義指向公共成員函式的指標變數應該採用下面的形式:void (time∷*p2)( ); //定義p2為指向time類中公用成員函式的指標變數。定義指標變數一般形式為資料型別名 (類名∷*指標變數名)(參數列列);
把公用成員函式的入口位址賦給乙個指向公用成員函式的指標變數:p2=&time∷get_time;
使指標變數指向乙個公用成員函式的一般形式為:指標變數名=&類名∷成員函式名;
共用資料的保護:private ,const
常物件:其資料成員為常量,但成員函式不一定都是。
常物件成員
指向常變數的指標變數:const char *ptr;
請記住這樣一條規則: 當希望在呼叫函式時物件的值不被修改,就應當把形參定義為指向常物件的指標變數,同時用物件的位址作實參(物件可以是const
或非const
型)。如果要求該物件不僅在呼叫函式過程中不被改變,而且要求它在程式執行過程中都不改變,則應把它定義為const
型。
物件的賦值:
物件的複製: 用乙個已有的物件快速地複製出多個完全相同的物件。是乙個從無到有的過程。
複製建構函式(copy constructor)
第一種賦值的形式與定義物件方式類似,但是括號中給出的引數不是一般的變數,而是物件。在建立物件時呼叫乙個特殊的建構函式,即複製建構函式。即這個函式的形式是這樣的:
//the copy constructor definition.
box∷box
(const box& b)
**複製建構函式也是建構函式,**但它只有乙個引數,這個引數是本類的物件(不能是其他類的物件),而且採用物件的引用的形式(一般約定加const宣告,使引數值不能改變,以免在呼叫此函式時因不慎而使物件值被修改)。
第一種形式實際上也是建立物件的語句,建立乙個新物件box2。由於在括號內給定的實參是物件,因此編譯系統就呼叫複製建構函式(它的形參也是物件),而不會去呼叫其他建構函式。實參box1的位址傳遞給形參b(b是box1的引用),因此執行複製建構函式的函式體時,將box1物件中各資料成員的值賦給box2中各資料成員。
靜態資料成員:同類的多個物件之間實現資料共享,其值對所有物件都是一樣的,改一次,則全改。
靜態資料成員和全域性變數的區別?
靜態成員函式:不是為了物件之間的溝通,而是為了能處理靜態資料成員
靜態成員函式與非靜態成員函式的根本區別是: 非靜態成員函式有this
指標,而靜態成員函式沒有this指標。由此決定了靜態成員函式不能訪問本類中的非靜態成員。
在類外可以訪問公用成員,只有本類中的函式可以訪問本類的私有成員。現在,我們來補充介紹乙個例外——友元(friend
)。
將普通函式宣告為友元函式
friend
void
display
(time &);
//在time類中宣告display函式為time類的友元函式
void
display
(time& t)
//這是友元函式,形參t是time類物件的引用
//hour,minute,sec是time類的私有成員
引用這些私有資料成員時,必須加上物件名,因為display函式不是time類的成員函式,不能預設引用time類的資料成員,必須指定要訪問的物件。
友元成員函式:friend 函式
是另乙個類中的成員函式。
因為在定義物件時是要為這些物件分配儲存空間的,在正式宣告類之前,編譯系統無法確定應為物件分配多大的空間。編譯系統只有在「見到」類體後,才能確定應該為物件預留多大的空間。
指標變數和引用變數本身的大小是固定的,與它所指向的類物件的大小無關。
class
date
;//對date類的提前引用宣告
class
time
;//display是成員函式,形參是date類物件的引用
class
date
;//宣告time中的display函式為友元成員函式
void time∷display
(date &d)
//display的作用是輸出年、月、日和時、分、秒
intmain()
乙個函式(包括普通函式和成員函式)可以被多個類宣告為「朋友」,這樣就可以引用多個類中的私有資料
友元類
友元優點:能有助於資料共享,能提高程式的效率
友元缺點:友元可以訪問其他類中的私有成員,對封裝原則的乙個破壞。
注:如果類模板中的成員函式在類模板外定義,不能用一般定義類成員函式的形式:numtype compare∷max( )
//不能這樣定義類模板中的成員函式。而應當寫成類模板的形式:
template
<
class 虛擬型別引數》
函式型別 類模板名《虛擬型別引數》∷成員函式名(函式形參表列)
如:template
<
class
numtype
>
numtype compare∷max()
字串基本概念 譚浩強 cpp
字串處理函式 include或者 include 字串複製函式strcpy 可以實現將乙個字串賦給乙個字元陣列,但是不能用賦值語句將乙個字串常量或字元陣列直接賦給乙個字元陣列。字串比較函式 strcmp 注意 對兩個字串比較,不能用以下形式 if str1 str2 cout yes 字元陣列名st...
Cpp 型別轉換
c風格的型別轉換c 完全相容。c 新增了四個顯式型別轉換運算子。1 靜態型別轉換 static cast 目標型別 a.將基類的指標或引用轉換為子類的指標或引用 b.自定義型別轉換。它允許子類型別的指標轉換為父類型別的指標 這是乙個有效的隱式轉換 同時,也能夠執行相反動作 轉換父類為它的子類,但會給...
Cpp深入 引用型別
1.如何從建立引用?2.引用型別初始化 3.更改別名?4.一般性的準則 1.如何建立引用?cpp中引用通過typename 實現建立,如下 int a 10 int alias a 2.引用型別初始化 引用型別需要在建立之初初始化,否則編譯器將報錯 int a 10 必須初始化,否則報錯 int a...