深刻解析C++編程中類的封裝特征。本站提示廣大學習愛好者:(深刻解析C++編程中類的封裝特征)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析C++編程中類的封裝特征正文
共用接口和公有完成的分別
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函數是怎樣完成的(函數值是如何盤算出來的)。
固然,條件是體系已裝了尺度函數庫。在用戶源文件經由編譯後,與體系庫(是目的文件)相銜接。
在用戶法式中包括類聲明頭文件,類聲明頭文件就成為用戶應用類的公用接口,在頭文件的類體中還供給了成員函數的函數原型聲明,用戶只要經由過程頭文件能力應用有關的類。用戶看得見和接觸到的是這個頭文件,任何要應用這個類的用戶只需包括這個頭文件便可。包括成員函數界說的文件就是類的完成。
請特殊留意,類聲明和函數界說普通是分離放在兩個文本中的。因為請求接口與完成分別,為軟件開辟商向用戶供給類庫發明了很好的前提。
開辟商把用戶所需的各類類的聲明按類放在分歧的頭文件中,同時對包括成員函數界說的源文件停止編譯,獲得成員函數界說的目的代碼。軟件商向用戶供給這些頭文件和類的完成的目的代碼(不供給函數界說的源代碼)。用戶在應用類庫中的類時,只需將有關頭文件包括到本身的法式中,而且在編譯後銜接成員函數界說的目的代碼便可。
因為類庫的湧現,用戶可以像應用零件一樣便利地應用在理論中積聚的通用的或公用的類,這就年夜年夜削減了法式設計的任務量,有用地進步了任務效力。