深入解析C++編程中類的封裝特性_C 語言

來源:互聯網
上載者:User

共用介面和私人實現的分離

C++通過類來實現封裝性,把資料和與這些資料有關的操作封裝在一個類中,或者說,類的作用是把資料和演算法封裝在使用者聲明的抽象資料類型中。

實際上使用者往往並不關心類的內部是如何?的,而只需知道調用哪個函數會得到什麼結果,能實現什麼功能即可。

在聲明了一個類以後,使用者主要是通過調用公用的成員函數來實作類別提供的功能(例如對資料成員設定值,顯示資料成員的值,對資料進行加工等)。因此,公用成員函數是使用者使用類的公用介面(public interface),或者說是類的對外介面。

類中被操作的資料是私人的,實現的細節對使用者是隱形,這種實現稱為私人實現(private implementation)。這種“類的公用介面與私人實現的分離”形成了資訊隱蔽。

軟體工程的一個最基本的原則就是將介面與實現分離,資訊隱蔽是軟體工程中一個非常重要的概念。它的好處在於:
如果想修改或擴充類的功能,只需修改本類中有關的資料成員和與它有關的成員函數,程式中類外的部分可以不必修改。
如果在編譯時間發現類中的資料讀寫有錯,不必檢查整個程式,只需檢查本類中訪問這些資料的少數成員函數。
類聲明和成員函數的分離

在物件導向的程式開發中,一般做法是將類的聲明(其中包含成員函數的聲明)放在指定的標頭檔中,使用者如果想用該類,只要把有關的標頭檔包含進來即可。

由於在標頭檔中包含了類的聲明,因此在程式中就可以用該類來定義對象。由於在類體中包含了對成員函數的聲明,在程式中就可以調用這些對象的公用成員函數。

為了實現上一節所敘述的資訊隱蔽,對類成員函數的定義一般不放在標頭檔中,而另外放在一個檔案中。

例如,可以分別寫兩個檔案:
student.h標頭檔

//這是student.h標頭檔,在此檔案中進行類的聲明class Student //類聲明{  public :  void display( );//公用成員函數原型聲明  private :  int num;  char name[20];  char sex;};

student.cpp

// 在此檔案中進行函數的定義#include <iostream>#include "student.h"//不要漏寫此行,否則編譯通不過void Student::display()//在類外定義display類函數{  cout<<"num:"<<num<<endl;  cout<<"name:"<<name<<endl;  cout<<"sex:"<<sex<<endl;}

為了組成一個完整的來源程式,還應當有包括主函數的源檔案(main.cpp):

// 主函數模組#include <iostream>#include ″student.h″ //將類聲明標頭檔包含進來int main( ){  Student stud; //定義對象  stud.display( ); //執行stud對象的display函數  return 0;}

這是一個包括3個檔案的程式,組成兩個檔案模組:一個是主模組main.cpp,一個是student.cpp。在主模組中又包含標頭檔student.h。在先行編譯時會將標頭檔student.h中的內容取代#include ″student.h″行。

請注意,由於將標頭檔student.h放在使用者目前的目錄中,因此在檔案名稱兩側用雙撇號包起來(″student.h″)而不用角括弧(<student.h>),否則編譯時間會找不到此檔案。

使用C++編譯系統對兩個源檔案main.cpp和student.cpp分別進行編譯,得到兩個目標程式main.obj和student.obj,然後將它們和其他系統資海串連起來,形成可執行檔main.exe,見圖 。

注意,目標檔案的尾碼在不同的C++編譯系統中是不同的,例如在GCC中,尾碼是 .o,這裡使用 .obj 是對VC 6.0而言。

在運行程式時調用stud中的display函數,輸出各資料成員的值。

有的讀者可能會考慮這樣一個問題:如果一個類聲明多次被不同的程式所調用,每次都要對包含成員函數定義的源檔案(如上面的student.cpp進行編譯,這是否可以改進呢?的確,可以不必每次都對它重複進行編譯,而只需編譯一次即可。把第一次編譯後所形成的目標檔案儲存起來,以後在需要時把它調出來直接與程式的目標檔案相串連即可。 這和使用函數庫中的函數是類似的。

這也是把成員函數的定義不放在標頭檔中的一個好處。如果對成員函數的定義也放在類聲明的標頭檔中,那麼在對使用這些類的每一個程式的每一次編譯時間都必然包括對成員函數定義的編譯,即同一個成員函數的定義會多次被重複編譯。只有把對成員函數的定義單獨放在另一檔案中,才能做到單獨編譯。

在實際工作中,並不是將一個類聲明做成一個標頭檔,而是將若干個常用的功能相近的類聲明集中在一起,形成類庫。

類庫有兩種:一種是C++編譯系統提供的標準類庫;—種是使用者根據自已的需要做成的使用者類庫,提供給自己和自己授權的人使用,這稱為自 定義類庫。在程式開發工作中,類庫是很有用的,它可以減少使用者自己對類和成員函數進行定義的工作量。

類庫包括兩個組成部分:類聲明標頭檔;已經過編譯的成員函數的定義,它是目標檔案。

使用者只需把類庫裝入到自己的電腦系統中(一般裝到C++編譯系統所在的子目錄下),並在程式中用#include命令列將有關的類聲明的標頭檔包含到程式中,就可以使用這些類和其中的成員函數,順利地運行程式。這和在程式中使用C++系統提供的標準函數的方法是一樣的,例如使用者在調用sin函數時只需將包含聲明此函數的標頭檔包含到程式中,即可調用該庫函數,而不必瞭解sin函數是怎麼實現的(函數值是怎樣計算出來的)。

當然,前提是系統已裝了標準函數庫。在使用者源檔案經過編譯後,與系統庫(是目標檔案)相串連。

在使用者程式中包含類聲明標頭檔,類聲明標頭檔就成為使用者使用類的公用介面,在標頭檔的類體中還提供了成員函數的函數原型聲明,使用者只有通過標頭檔才能使用有關的類。使用者看得見和接觸到的是這個標頭檔,任何要使用這個類的使用者只需包含這個標頭檔即可。包含成員函數定義的檔案就是類的實現。

請特別注意,類聲明和函數定義一般是分別放在兩個文本中的。由於要求介面與實現分離,為軟體開發商向使用者提供類庫創造了很好的條件。

開發商把使用者所需的各種類的聲明按類放在不同的標頭檔中,同時對包含成員函數定義的源檔案進行編譯,得到成員函數定義的目標代碼。軟體商向使用者提供這些標頭檔和類的實現的目標代碼(不提供函數定義的原始碼)。使用者在使用類庫中的類時,只需將有關標頭檔包含到自己的程式中,並且在編譯後串連成員函數定義的目標代碼即可。

由於類庫的出現,使用者可以像使用零件一樣方便地使用在實踐中積累的通用的或專用的類,這就大大減少了程式設計的工作量,有效地提高了工作效率。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.