類的定義與對象的創建
1.實驗目的
(1)理解並學會使用類,並創造合適的對象
(2)掌握在什么場景下需要使用 類
2.實驗內容
類的定義、類成員的訪問控制、對象、類的成員函數
3.實驗過程
3.1類和對象
Part1.應用場景
類是面向對象程序設計方法的核心,利用類可以實現對數據的封裝和隱蔽。
在面向對象程序設計中,程序模塊是由類構成的。類是對邏輯上相關的函數與數據的封裝,它是對問題的抽象描述。
Part2.定義及代碼
3.1.1類的定義
class 類名稱 { public: 外部接口 protected: 保護型成員 private: 私有成員 };
其中,public、protected、private分別表示對成員的不同訪問控制權限。
注意:在類中可以只聲明函數的原型,函數的實現(即函數體)可以在類外定義。
例:
時鍾類
class Clock{ public : void setTime(int newH,int newM,int newS); void showTime(); private: int hour,minute,second; };
這里封裝了時鍾的數據和行為,分別稱為Clock類的數據成員和函數成員。
3.1.2類成員的訪問控制
類的成員包括:數據成員、函數成員。分別描述問題的屬性和行為,是不可分割的兩個方面。
訪問控制屬性(3種):公有類型 public,私有類型 private,保護類型 protected。
特點:①公有類型:公有類型成員定義了類的外部接口在類外只能訪問類的公有成員;
②私有類型:后面聲明的是私有成員,如果私有成員緊接着類的名稱,則關鍵字private可以省略。
私有成員只能被本類的成員函數訪問,來自類外部的任何訪問都是非法的。保護了數據的安全性。
(一個類的數據成員都應該聲明為私有成員,使模塊之間的相互作用被降低到最小)
③保護類型:保護類型成員和私有成員的性質相似,其差別在於繼承過程中對產生的新類影響不同。
注意:具有不同訪問屬性的成員可以按任意順序出現,修飾訪問屬性的關鍵字也可以多次出現,但是一個成員只能有一種訪問屬性。
3.1.3對象
類的對象就是該類的某一特定實體(也稱實例)。
聲明方式:
類名 對象名;
例如:
Clock myClock;
訪問數據成員的一般形式:
對象名.數據成員名;//用“.”
調用函數成員的一般形式:
對象名.函數成員名(參數表);//使用“.”
例:
myClock.showTime();
注意:在類的外部只能訪問到類的公有成員;在類的成員函數中,可以訪問到類的全部成員。
3.1.4類的成員函數
類的成員函數描述的是類的行為,例如時鍾類的成員函數setTime()和showTime()。成員函數是程序算法的實現部分,是對封裝的數據進行操作的方法。
①成員函數的實現
函數原型的聲明要寫在類體中,原型說明了函數的參數表和返回值類型。而函數的具體實現是寫在類定義之外的。
與普通函數不同,實現成員函數時要指明類的名稱。
具體形式:
返回值類型 類名::函數成員名(參數表){
函數體
}
例如:
void Clock::setTime(int newH,int newM,int newS){ hour=newH; minute=newM; second=newS; } void Clock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; }
可以看出與普通函數不同,類的成員函數名需要用類名來限制,例如 Clock::showTime()。
②成員函數調用中的目的對象
調用一個成員函數和一個普通函數的差異在於,需要使用“.”的操作符指出調用所針對的對象,這一對象在本次調用中稱為目的對象。
在成員函數中可以不使用“.”的操作符而直接引用目的對象的數據成員。
在成員函數中引用其他對象的屬性和調用其他對象的方法時,都需要使用“.”。
③帶默認形參值的成員函數
類的成員函數可以有默認參數值,其調用規則與普通函數相同。
類成員函數的默認值,一定要寫在類定義中,而不能寫在類定義之外的函數實現中。
例:
class Clock{ public: void setTime(int newH=0,int newM=0,int newS=0); ...... };
如果調用這個函數時沒有實參,就會按照默認值將時鍾設置到默認零點。
3.1.5內聯成員函數
如果有的成員函數需要被頻繁調用,而且代碼比較簡單,這個函數也可以定義為內聯函數。
聲明方式:
隱式聲明和顯式聲明
隱式聲明:將函數體直接放在類體內
class Clock{ public: void setTime(int newH,int newM;int newS); void showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; } private: int hour,minute,second; };
顯式聲明:采用關鍵字inline
inline void Clock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl; }
效果和前面的隱式表達完全相同。
3.1.6程序實例
#include<iostream> using namespace std; class Clock { public: void setTime(int newH = 0, int newM = 0, int newS = 0); void showTime(); private: int hour, minute, second; }; void Clock::setTime(int newH, int newM, int newS) { hour = newH; minute = newM; second = newS; } inline void Clock::showTime() { cout << hour << ":" << minute << ":" << second << endl; } int main() { Clock myClock; cout << "First time set and output:" << endl; myClock.setTime(); myClock.showTime(); cout << "Secong time set and output:" << endl; myClock.setTime(8, 30, 30); myClock.showTime(); return 0; }
分析:
本程序可分為三個獨立的部分,第一部分是類的Clock定義,第二部分是時鍾類成員函數的具體實現,第三部分是主函數main()。
這里的成員函數setTime是帶有默認參數值的函數,有三個默認參數。showTime是顯式聲明的內聯成員函數。
主函數中聲明了一個類的對象myClock,然后用這個對象調用其成員函數。