前面我們學習了如何定義類,以及如何使用類的成員,在前面我們把成員函式都定義在了類的內部,接下來我們學習,如何把類的定義和成員函式的實現分離。
在物件導向的程式開發中,一般做法是將類的宣告(其中包含成員函式的宣告)放在指定的標頭檔案中,使用者如果想用該類,只要把有關的標頭檔案包含進來即可,不必在程式中重複書寫類的宣告,以減少工作量,節省篇幅,提高程式設計的效率。由於在標頭檔案中包含了類的宣告,因此在程式中就可以用該類來定義物件。由於在類體中包含了對成員函式的宣告,在程式中就可以呼叫這些物件的公用成員函式。為了實現上一節所敘述的資訊隱蔽,對類成員函式的定義一般不放在標頭檔案中,而另外放在乙個檔案中。例如,可以分別寫兩個檔案:
student.h 這是標頭檔案,在此文僅重進行類的宣告
#pragma once #include #include #include #include using namespace std; class student ;
student.cpp 這是原始檔,類的所有函式都在此檔案中實現
#include "student.h" void student::init(int sid, int sage, const char* sname) void student::showstuinfo()
類的申明和成員函式定義分離注意問題和寫在裡面一樣,但是需要指定作用域,在外面的函式名前面加上類名,形如【類名::函式名】 :: 雙冒號是作用域限定符
如果函式引數有預設引數,那麼宣告和實現不能同時存在預設引數,建議保留宣告中的預設引數,讓使用者看到
如果乙個student.h同時被多個檔案呼叫,每次都要對包含成員函式定義的原始檔(如上面的student.cpp)進行編譯,這是否可以改進呢?的確,可以不必每次都對它重複進行編譯,而只需編譯一次即可。把第一次編譯後所形成的目標檔案儲存起來,以後在需要時把它調出來直接與程式的目標檔案相連線即可。這和使用函式庫中的函式是類似的。這也是把成員函式的定義不放在標頭檔案中的乙個好處。(靜態庫,以後會講)
在實際工作中,並不是將乙個類宣告做成乙個標頭檔案,而是將若干個常用的功能相近的類宣告集中在一起,形成類庫。類庫有兩種:c++編譯系統提供的標準類庫;使用者根據自己的需要做成的使用者類庫,提供給自己和自己授權的人使用,這稱為自定義類庫。
在程式開發工作中,類庫是很有用的,它可以減少使用者自己對類和成員函式進行定義的工作量。
類庫包括兩個組成部分:類宣告標頭檔案;已經過編譯的成員函式的定義,它是目標檔案。
使用者只需把類庫裝入到自己的計算機系統中(一般裝到c++編譯系統所在的子目錄下),並在程式中用#include命令行將有關的類宣告的標頭檔案包含到程式中,就可以使用這些類和其中的成員函式,順利地執行程式。這和在程式中使用c++系統提供的標準函式的方法是一樣的,例如使用者在呼叫sin函式時只需將包含宣告此函式的標頭檔案包含到程式中,即可呼叫該庫函式,而不必了解sin函式是怎麼實現的(函式值是怎樣計算出來的)。當然,前提是系統已裝了標準函式庫。在使用者原始檔經過編譯後,與系統庫(是目標檔案)相連線。在使用者程式中包含類宣告標頭檔案,類宣告標頭檔案就成為使用者使用類的公用介面,在標頭檔案的類體中還提供了成員函式的函式原型宣告,使用者只有通過標頭檔案才能使用有關的類。使用者看得見和接觸到的是這個標頭檔案,任何要使用這個類的使用者只需包含這個標頭檔案即可。包含成員函式定義的檔案就是類的實現。請特別注意:類宣告和函式定義一般是分別放在兩個文字中的。由於要求介面與實現分離,為軟體開發商向使用者提供類庫創造了很好的條件。開發商把使用者所需的各種類的宣告按類放在不同的標頭檔案中,同時對包含成員函式定義的原始檔進行編譯,得到成員函式定義的目標**。軟體商向使用者提供這些標頭檔案和類的實現的目標**(不提供函式定義的源**)。使用者在使用類庫中的類時,只需將有關標頭檔案包含到自己的程式中,並且在編譯後連線成員函式定義的目標**即可。由於類庫的出現,使用者可以像使用零件一樣方便地使用在實踐中積累的通用的或專用的類,這就大大減少了程式設計的工作量,有效地提高了工作效率。
類宣告和成員函式定義的分離
當乙個類被多個程式使用時,一般將 類的宣告 包含成員函式的宣告 放在指定的 標頭檔案中,使用者程式設計時,只需將這個標頭檔案包含進來,而不必在每個使用該類的程式中重複書寫其宣告。為了實現資訊隱蔽 即封裝後,使用者只能看到函式的宣告,知道如何去使用它,而不知道函式具體是如何實現的 對類的成員函式的定義...
Time類的定義(成員函式)
time limit 1000ms memory limit 65536k 通過本題目的練習可以掌握類與物件的定義 設計乙個時間類 time 私有資料成員有 hour 時 minute 分 second 秒 公有成員函式有 sethour int 設定資料成員 hour 的值,非法的輸入預設為12 ...
模版類的成員函式定義問題
原因 模板是在使用的時候才就地生成 的。就是說如果沒有使用到該模板,模板的 根本不會被編譯。當你類似templatename這樣使用乙個模板的時候,編譯器才將int這個型別引入templatename這個模板的 從而生成所需要的class。你將模板實現分開,那麼編譯器在引入int型別到模板 的時候,...