C 類與物件 05

2022-04-23 02:42:00 字數 4839 閱讀 2716

類是具有惟一識別符號的實體;在類中宣告的任何成員不能使用extern、auto和register關鍵字進行修飾;類中宣告的變數屬於該類,在某些情況下,變數也可以被該類的不同例項所共享。

訪問許可權用於控制物件的某個成員在程式中的可訪問性,如果沒有使用關鍵字,則所有成員預設宣告為private許可權。

定義成員函式

類中宣告的成員函式用來對資料成員進行操作,還必須在程式中實現這些成員函式。 定義成員函式的一般形式如下:  

返回型別 類名::成員函式名(引數列表)  

其中「::」是作用域運算子,「類名」是成員函式所屬類的名字,「::」用於表名其後的成員函式是屬於這個特定的類。換言之,「類名::成員函式名」的意思就是對屬於「類名」的成員函式進行定義,而「返回型別」則是這個成員函式返回值的型別。  也可以使用關鍵字inline將成員函式定義為內聯函式。  如果在宣告類的同時,在類體內給出成員函式的定義,則預設為內聯函式。

資料成員的賦值

不能在類體內給資料成員賦值。在類體外就更不允許了。 資料成員的具體值是用來描述物件的屬性的。只有產生了乙個具體的物件,這些資料值才有意義。如果在產生物件時就使物件的資料成員具有指定值,則稱為物件的初始化。

使用類的物件

物件和引用都使用運算子「.」訪問物件的成員,指標則使用「- >」運算子。

(1)類的成員函式可以直接使用自己類的私有成員(資料成員和成員函式)

(2)類外面的函式不能直接訪問類的私有成員(資料成員和成員函式)

(3)類外面的函式只能通過類的物件使用該類的公有成員函式。

在程式執行時,通過為物件分配記憶體來建立物件。在建立物件時,使用類作為樣板,故稱物件為類的例項。  

定義類物件指標的語法如下:

類名* 物件指標名;  

物件指標名=物件的位址;

也可以直接進行初始化。  

類名* 物件指標名=物件的位址;  

類物件的指標可以通過「->」運算子訪問物件的成員,即: 物件指標名->物件成員名

資料封裝

物件導向的程式設計是通過為資料和**建立分塊的記憶體區域,以便提供對程式進行模組化的一種程式設計方法,這些模組可以被用做樣板,在需要時在建立其副本。根據這個定義,物件是計算機記憶體中的一塊區域,通過將記憶體分塊,每個模組(即物件)在功能上保持相對獨立。  物件被視為能做出動作的實體,物件使用這些動作完成相互之間的作用。換句話說,物件就像在宿主計算機上擁有資料和**並能相互通訊的具有特定功能的一台較小的計算機。

運算子new

運算子new用於建立生存期可控的物件,new返回這個物件的指標。由於類名被視為乙個型別名,因此,使用new建立動態物件的語法和建立動態變數的語法類似,其不同點是new和建構函式一起使用。使用new建立的動態物件只能用delete刪除,以便釋放所佔空間。應養成及時釋放不再使用的記憶體空間的習慣。 

賦值建構函式

編譯器建立乙個預設複製建構函式,預設複製建構函式採用拷貝方式使用已有的物件來建立新物件,所以又直譯為拷貝建構函式。程式設計師可以自己定義複製建構函式,對類a而言,複製建構函式的原型如下:  

a::a(a&)

從這個函式原型來看,首先它是乙個建構函式,因為這畢竟是在創造乙個新物件。其次,他的引數有些特別,是引用類自己的物件,即用乙個已有的物件來建立新物件。使用引用是從程式的執行效率角度考慮的。為了不改變原有物件,更普通的形式是像下面這樣使用const限定:  a::a(const a &) 

析構函式

在物件消失時,應使用析構函式釋放由建構函式分配的記憶體。建構函式、賦值建構函式和析構函式是構造型成員函式的基本成員,應深刻理解他們的作用並熟練掌握其設計方法。

呼叫析構函式也是由編譯器來完成的,所以編譯器必須總能知道應呼叫哪個函式。最容易、也最符合邏輯的方法是指定這個函式的名稱與類名一樣。為了與析構函式區分,在析構函式的前面加上乙個「~」號(仍然稱析構函式與類同名)。在定義析構函式時,不能指定任何返回型別,即使指定void型別返回型別也不行。析構函式也不能指定引數,但是可以顯示地說明引數為void,即形如a::~a(void)。從函式過載的角度分析,乙個類也只能定義乙個析構函式且不能指明引數,以便編譯系統自動呼叫。

析構函式在物件的生存期結束時被自動呼叫。當物件的生存期結束時,程式為這個物件呼叫析構函式,然後**這個物件占用的記憶體。全域性物件和靜態物件的析構函式在程式執行結束之前呼叫。  類的物件陣列的每個元素呼叫一次析構函式。全域性物件陣列的析構函式在程式結束之前被呼叫。

析構函式與運算子delete

運算子delete與析構函式一起工作。當使用運算子delete刪除乙個動態物件時,他首先為這個動態物件呼叫析構函式,然後再釋放這個動態物件占用的記憶體,這和使用new建立動態物件的過程正好相反。

當使用delete釋放動態物件陣列時,必須告訴這個動態物件陣列有幾個元素物件,c++使用「[ ]」來實現。即語句  delete[ ] ptr

當程式先後建立幾個物件時,系統按後建先析構的原則析構物件。當使用delete呼叫析構函式時,則按delete的順序析構。

預設析構函式

如果在定義類時沒有定義析構函式,c++編譯器也為它產生乙個函式體為空的預設析構函式。

this指標

使用this指標,保證了每個物件可以擁有自己的資料成員,但處理這些資料成員的**可以被所有的物件共享。

c++規定,當乙個成員函式被呼叫時

,系統自動向它傳遞乙個隱含的引數,該引數是乙個指向呼叫該函式的物件的指標,從而使成員函式知道該對哪個物件進行操作。在程式中,可以使用關鍵字this來引用該指標。this指標是c++實現封裝的一種機制,它將物件和該物件呼叫的成員函式連線在一起,在外部看來,每乙個物件都擁有自己的成員函式。  

除非有特殊需要,一般情況下都省略符號「this ->」,而讓系統進行預設設定。

物件的性質

(1)同乙個類的物件之間可以相互賦值。

(2)可使用物件陣列。  

(3)可使用指向物件的指標,使用取位址運算子&將乙個物件的位址置於該指標中。 注意,指向物件的指標不能取資料成員的位址,也不能去成員函式的位址。  

(4)物件可以用作函式引數。物件作為函式引數時,可以使用物件、物件引用和物件指標。

(5)乙個物件可以做為另乙個類的成員。

類的性質

使用類的許可權

資料成員為私有,成員函式為公有的情況:

(1)類本身的成員函式可以使用類的所有成員(私有和公有成員)。

(2)類的物件只能訪問公有成員函式。

(3)其他函式不能使用類的私有成員,也不能使用公有成員函式,它們只能通過類的物件使用類的公有成員函式。

(4)雖然乙個可以包含另外乙個類的物件,但這個類也只能通過被包含類的物件使用那個類的成員函式,通過成員函式使用資料成員。

物件導向程式設計的檔案規範

一般要求將類的宣告放在標頭檔案中,非常簡單的成員函式可以在宣告中定義(缺省內聯函式形式),實現放在.cpp檔案中。在.cpp檔案中,將標頭檔案包含進去。主程式單獨使用乙個檔案,這就是多檔案程式設計規範。

c++的源程式可包含各種編譯指令,以指示編譯器對源**進行編譯之前先對其進行預處理。所有的編譯指令都以#開始,每條編譯指令單獨占用一行,同一行不能有其他編譯指令和c++語句(注釋例外)。編譯指令不是c++的一部分,但擴充套件了c++程式設計環境的使用範圍,從而改善程式的組織和管理。

嵌入指令:

#include指示編譯器將乙個原始檔嵌入到帶有#include指令的原始檔中該指令所在的位置處。尖括號或雙引號中的檔名可包含路徑資訊。例如:  #include<\user\prog.h> 注意:由於編譯指令不是c++的一部分,因此,在這裡表示反斜槓時只使用乙個反斜槓。

巨集定義:

#define指令定義乙個識別符號字串,在源程式中每次遇到該識別符號時,編譯器均用定義的字串代替之。該識別符號稱為巨集名,而將替換過程稱之為巨集替換。#define指令用以進行巨集定義,其一般形式如下: #define 巨集名 替換正文 ,「巨集名」必須是乙個有效的c++識別符號,「替換正文」可為任意字元組成的字串行。「巨集名」和「替換正文」之間至少有乙個空格。注意,巨集定義由新行結束,而不以分號結束。如果給出了分號,則它也被視作為替換正文的一部分。當替換正文要書寫在多行上時,除最後一行外,每行的行尾要加上乙個反斜線,表示巨集定義繼續到下一行。 因巨集定義有許多不安全因素,對需要使用無引數巨集的場合,應該盡量使用const代替巨集定義。 在程式的乙個地方定義的巨集名,如果不想使其影響到程式的其他地方,可以在不再使用時用#undef刪除

條件編譯指令:

條件編譯指令是#if、#else、#elif和#endif,它們構成類似於c++的if選擇結構,其中#endif表示一條指令結束。  編譯指令#if用於控制編譯器對源程式的某部分有選擇地進行編譯。該部分從#if開始,到#endif結束。如果#if後的常量表示式為真,則編譯這部分,否則就不編譯該部分,這時,這部分**相當於被從原始檔中刪除。  編譯指令#else在#if測試失效的情況下建立另外一種選擇。可以在#else分支中使用編譯指令#error輸出出錯資訊。#error使用的形式如下:  #error 出錯資訊  「出錯資訊」是乙個字串行。當遇到#error指令時,編譯器顯示其後面的「出錯資訊」,並中止對程式的編譯。  編譯指令可巢狀,巢狀規則和編譯器對其的處理方式與c++的if預計巢狀情況類似。

define操作符

關鍵字defined不是指令,而是乙個預處理操作符,用於判斷乙個識別符號是否已經被#define定義。如果識別符號identifier已被#define定義,則defined(identifier)為真,否則為假。  條件編譯指令#ifdef和#ifndef用於測試其後的識別符號是否被#define定義,如果已經被定義,則#ifdef測試為真,#ifndef測試為假;如果沒有被定義,則#ifdef測試為假,#ifndef測試為真。

在標頭檔案中使用條件編譯

友元函式

有時兩個概念上相近的類要求其中乙個類可以無限制地訪問另乙個類的成員。  友元函式解決了這類難題。友元函式可以訪問私有成員、公有成員和保護成員。其實,友元函式可以是乙個類或函式,尚未定義的類也可以作為友元引用。

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

Day05 類與物件

物件導向的特點 從執行者變為指揮者,包括封裝,繼承與多型。什麼是類?類是一組相關屬性和行為的集合。什麼是物件?是一類事物的具體體現。物件是類的例項,具備該事物的屬性和行為。類與物件的關係 類是對一類事物的描述。物件是一類事物的例項。類是物件的模板,物件是類的實體。類的定義 格式 public cla...

C 類與物件

程式設計模型 所有計算機均由兩種元素組成 和資料.精確的說,有些程式是圍繞著 什麼正在發生 而編寫,有些則是圍繞 誰正在受影響 而編寫的.抽象封裝 封裝是一種把 和 所操作的資料 在一起,使這兩者不受外界干擾和誤用的機制.繼承 繼承是指乙個物件從另乙個物件中獲得屬性的過程.是物件導向程式設計的三大原...

C 類與物件

c 類與物件 區分物件導向與面向過程 物件導向是指一種程式設計范型,同時也是一種程式開發的方法。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性 靈活性和擴充套件性。物件導向 利用物件間的訊息傳遞來驅動程式的執行。優點 真實表現客觀世界,物件間的關係清晰,物件間的訊息處理高效。面...