C 特殊函式和成員

2021-10-18 16:22:44 字數 3397 閱讀 9231

物件成員的初始化

可以在乙個類中說明具有某個類的型別的資料成員,這些成員成為物件成員。在類a中說明物件成員的一般形式如下:

class a

;說明物件成員是在類名之後給出物件成員的名字。為初始化物件成員,a類的建構函式需要呼叫這些物件成員所在的類的建構函式,a類的建構函式的定義形式如下:

a::a(參數列 0):成員 1(參數列 1),成員2(參數列2),成員n(引數n)

冒號「:」 後由逗號隔開的專案組成員初始化列表,其中的參數列給出了為呼叫想要成員所在類的建構函式時應提供的引數。引數列表中的引數都來自「參數列0」,可以使用任意複雜的表示式,其中可以有函式呼叫。如果初始化列表某項的參數列為空,則列表中想要的項可以省略。

物件成員建構函式的順序取決於這些物件成員在類中說明的順序,與他們在成員初始化列表中給出的順序無關。析構函式的呼叫順序與建構函式正好相反。

靜態成員

簡單成員函式是指宣告中不含const ,volatile ,static 關鍵在的函式。 如果類的資料成員或成員函式使用關鍵字static進行修飾,這樣的成員成稱為靜態資料成員或靜態成員函式,統稱為靜態成員。

靜態資料成員只能說明一次,如果在類中僅對靜態資料成員進行宣告,則必須在檔案作用域的某個地方進行定義。在進行初始化之前,必須進行成員名限定。

注意:由於static不是函式中的一部分,所以在類宣告之外定義靜態成員函式時,不使用static。在類中定義的靜態成員函式時內聯的。

類中的任何成員函式都可以訪問靜態成員。因為靜態成員函式沒有this指標,所以靜態成員函式只能通過物件名(或指向物件的指標)訪問該物件的非靜態成員。

靜態成員函式與一般函式由如下不同:

(1)可以不指向某個具體的物件,只與類名連用

(2)在沒有建立物件之前,靜態成員就已經存在

(3)靜態成員是類的成員,不是物件的成員

(4)靜態成員為該類的所有物件共享,他們被儲存於乙個公有的記憶體中

(5)沒有this指標,所以除非顯示的把指標傳給他們,否則不能訪問類的資料成員。

(6)靜態成員函式不能說明為虛函式

(7)靜態成員函式不能直接訪問非靜態函式

靜態物件具有如下性質:

(1)建構函式在**執行過程中,第一次遇到它的時候變數定義時被呼叫,但直到整個程式結束之前僅呼叫一次

(2)析構函式在整個程式退出之前被呼叫,同樣也只能呼叫一次。

友元函式

有時兩個概念商相近的類要求其中乙個類可以無限制地訪問另乙個類的成員。

友元函式解決了這類難題。友元函式可以訪問私有成員、公有成員和保護成員。其實,友元函式可以是乙個類或函式,尚未定義的類也可以作為友元引用。

類本身的友元函式

為本類宣告乙個友元函式,這時,雖然在類中說明它,但它並不是類的成員函式,所以可以在類外面像普通函式那樣定義這個函式。

雖然友元函式時在類中說明的,但函式的定義一般在類之外,作用域的開始點在它的說明點。結束點和類的作用域相同。

友元說明可以出現於類的私有或公有部分。因為友元說明也必須出現於類中,所以應將友元看做類的介面的一部分。使用它的主要目的是提高程式效率。友元函式可以直接訪問類物件的私有程式,因而省去呼叫類成員函式的開銷。它的另乙個優點是:類的設計者不必在考慮號該類的各種可能使用情況之後再設計這個類,而可以根據需要,通過使用友元增加類的介面,但是有友元的主要問題是: 它允許友元函式訪問物件的私有成員,這破壞了封裝和資料隱藏,導致程式的可維護性變差,因此在使用友元時必須權衡得失。

注意:友元函式可以在類中宣告時定義,如果在類外定義,不能再使用friend關鍵字。

將成員函式用作友元。

乙個類的成員函式,可以通過使用friend說明為另乙個類的友元。

將乙個類說明為另乙個類的友元

可以將乙個類說明為另乙個類的友元。

可以將乙個類說明為另乙個類的友元。這時,整個類的成員函式均具有友元函式的效能。

宣告友元關係簡化為「friend class」類名。

需要注意的是,友元關係是不傳遞的,即當說明類a是類b的友元。類b又是類c的友元時,類a卻不是類c的友元。這種友元關係也不具有交換行,即當說明類a是類b的友元時,類b不一定時類a的友元。

當乙個類要和另乙個類協同工作時,使乙個類稱為另乙個類的友元是很有用的。

友元宣告與訪問控制無關,友元宣告在私有區域進行或者在公有區域進行時沒有太大區別的。雖然友元函式的宣告可以置於任何部分,但通測置於能強調其功能的地方以使其直觀。對友元函式宣告的唯一限制使該函式必須出現在類宣告內的某一部分。

const 物件

可以在類中使用const關鍵字定義資料成員和成員函式或修飾乙個物件。乙個const物件只能訪問const成員函式,否則將產生編譯錯誤。

常量成員

常量成員包括常量資料成員,靜態常資料成員和常引用。靜態常資料成員仍保留靜態成員特徵,需要在類外初始化。常數成員和常引用只能通過初始化列表來獲得初值。

常引用作為函式引數

使用引用作為引數,傳送的是位址。但有時僅希望將引數的值提供給函式使用,並不允許函式改變物件的值,這時可以使用常量引用作為引數。

常物件在物件名前使用const宣告常量物件,但宣告時必須同時進行初始化,而且不能被更新。

定義語法如下:

類名 const 物件名(參數列):

常成員函式

可以宣告乙個成員函式為const函式。乙個const物件可以呼叫const函式,但不能呼叫非const成員函式。const放在函式宣告之前意味著返回值是常量,但這不符合語法。必須將關鍵字const放在引數列表後,才能說明該函式時乙個const成員函式,宣告常成員函式的格式如下:

型別識別符號 函式名(引數列表) const;

為了保證不僅宣告const成員函式,而且確實也定義為const函式,程式設計師在定義函式時必須重申const宣告 。也就是說,const已經成為這種成員函式識別符的一部分,編譯器和連線程式都要檢查const 。定義格式如下:

型別識別符號 類名 ::函式名(引數列表) const

const 位於函式引數類別之後,函式體之前。也可以在類中用內聯函式定義const函式。

型別識別符號 函式名(引數列表) const

在定義成員函式時,函式體之前加上const可以防止覆蓋函式改變資料成員的值。

在常成員函式裡,不能更新物件的資料成員,也不能呼叫該類中沒有用const修飾的成員函式。如果將乙個物件說明為常物件,則通過該物件只能呼叫它的const成員函式,不能呼叫其他成員函式。

注意:用const 宣告static成員函式沒有什麼作用。在c++中宣告建構函式和析構函式時使用const關鍵字均是廢廢的,但有些c++編譯程式並不給出出錯資訊。volatile關鍵字的使用方法與const類似,但因其很少用,此處不介紹。

陣列和類

編譯器呼叫適當的建構函式建立陣列的每乙個分量。如果找不到合適的建構函式,則產生錯誤資訊。

指向類成員函式的指標

物件是乙個完整的實體。

特殊成員函式

特殊函式成員 1靜態成員函式 靜態成員函式體內不能使用非靜態的成員變數和非靜態的成員函式 只能呼叫靜態成員資料和函式 因為靜態屬於乙個類,而不是某個物件,所以沒有this指標 要想訪問成員變數和成員方法,需要在函式的引數中傳入乙個物件 include include include using na...

C 類的特殊成員函式

類的特殊成員函式 特殊成員函式的難點在於它們何時被呼叫,以及可能產生的一些問題。建構函式 每個類都有自己的建構函式,即使乙個建構函式都沒定義,編譯器也會自動生成預設建構函式。建構函式下面有細分的種類 建構函式 每個物件建立時,都會呼叫建構函式。如果物件是封閉類,那麼生成乙個物件時,先呼叫成員物件類的...

c 中的特殊成員函式

如果沒有提供任何建構函式,c 將建立預設建構函式。例如假設定義了乙個k類,但沒有提供任何建構函式,編譯器則提供下面的預設建構函式 k k 也就是說,編譯器將提供乙個沒有引數的建構函式,不接受任何引數,也不執行任何操作的建構函式。這是因為建立物件的時候總會呼叫建構函式。k k 建立乙個物件使用預設構造...