C++類與對象(05)

來源:互聯網
上載者:User

標籤:面向   相互   編譯器   特定   習慣   layer   影響   靜態對象   數列   

類是具有惟一標識符的實體;在類中聲明的任何成員不能使用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測試為真。

在標頭檔中使用條件編譯

 

C++類與對象(05)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.