「這項工做有誰來完成」這個問題對於設計類和使用對象來講很是重要。html
在編寫程序以前,很重要的一步就是問問本身須要哪些類,每一個類分別完成什麼功能。ios
以下是一些之前使用過的類:c++
string 處理文本數據函數
vector 數據列表post
queue 隊列,先入先出url
ifstream 打開數據文件並讀取文件spa
ofstream 打開數據文件並寫入文件設計
要使用這些類,須要在程序文件的開頭包含對應的庫文件,而後就能夠建立對象來完成特定的工做。指針
對象後面跟一個點運算符的方式來訪問類中的定義功能code
編寫本身的類
類的定義格式:
一般,會在public部分定義類的行爲,提供公共的函數接口供外部訪問;在protected部分,定義遺傳特性;在private部分,定義這個類私有的屬性和行爲。
與類成員的訪問控制相似,派生方式也有三種:public派生,全部所有繼承,不作改變,如Teacher類從Human類中派生;private派生,把基類的全部公有(public)成員都變成本身私有的,這樣派生類不在直接支持基類的公有接口,它只但願能夠重用基類的實現而已;protected派生,把基類的全部公有(public)成員都變成protected類型,保護基類的全部接口不被外界訪問,只能由自身及自身的派生類訪問。
c++程序都遵循這樣一個慣例:將類的聲明保存在於類名稱相同的頭文件(*.h)中,而類成員函數的實現代碼保存在同名的*,cpp中,例如Data.cpp。
所以,一個類的代碼每每保存在一對文件中,例如Date.h和Date.cpp。這樣能夠方便代碼的複用,只要把一個類的兩個文件加入到工程中就可使用了。參見C++中的頭文件和源文件
具體例子:
整個程序包含一個頭文件.h,和2個.cpp源文件,以下
代碼:
.h文件,負責類的聲明
#pragma once //防止一個 頭文件被屢次編譯 #include<string> using namespace std; class VolumeCalc { private: double sphRadius; double boxLength, boxWidth, boxHeight; double sphVolume, boxVolume; void CalcBoxVol();//被set函數調用 void CalcSphVol(); public: VolumeCalc(); //類的構造函數,建立對象時,會自動調用的成員函數 void SetSphRadius(double r); void SetBoxDim(double l, double w, double h);//set函數老是負責把數據傳入到類中,get函數負責從類中取出數據 double GetSphVol() { return sphVolume; } double GetBoxVol() { return boxVolume; }//函數簡單的話直接在裏面定義了就 };
同名的.cpp負責函數 的實現,
//包含volume cal類 的一些函數定義 #include"VolumeCalc.h" #include<cmath> using namespace std; VolumeCalc::VolumeCalc() //構造函數 { boxHeight = boxWidth = boxLength = 0.0; sphRadius = 0.0; boxVolume = sphVolume = 0.0; } //set函數在收到新數據以後就調用calcula函數 void VolumeCalc::SetSphRadius(double r) { sphRadius = r; CalcSphVol(); } void VolumeCalc::SetBoxDim(double l, double w, double h) { boxLength = l; boxWidth = w; boxHeight = h; CalcBoxVol(); } void VolumeCalc::CalcBoxVol() { boxVolume = boxHeight*boxLength*boxWidth; } void VolumeCalc::CalcSphVol() { double PI = 3.14159265; sphVolume = 4.0 / 3.0*PI*pow(sphRadius, 2); }
另外一個爲主函數:
#include<iostream> #include"VolumeCalc.h" //#include<cmath> .h頭文件已經包含,能夠略去 using namespace std; int main() { cout << "calculation volume of a" << " box or a sphere" << endl; VolumeCalc Bob; //建立對象,讓BOb替咱們來完成計算 //使用局部變量len,wid等來保存用戶輸入的數據 double len, wid, hgt; double rad; cout << "Box : ENTER the length width and geight \n"; cin >> len >> wid >> hgt; cout << "Box : ENTER the radius \n"; cin >> rad; Bob.SetBoxDim(len, wid, hgt); Bob.SetSphRadius(rad);//set函數老是負責把數據傳入到類中,get函數負責從類中取出數據 //其實。類不過是擴展咱們可使用的數據類型,也不用想的有多麼難 //如今,讓Bob告訴咱們計算的數據結果, //調用對象的get函數 double sphereV = Bob.GetSphVol(); double boxV = Bob.GetBoxVol(); cout.setf(ios::fixed); cout.precision(3); cout << "\n box volume :" << boxV << "\n sphere volume :" << sphereV; cin.get(); cin.get(); return 0; }
關於析構函數:
new關鍵字建立一個指向對象 的指針,
//建立一個新的對象,並讓pMrChen指針指向這個新的對象
Teacher* pMrChen = new Teacher(); //以前已經定義了Teacher類
這裏,使用「new」關鍵字建立了一個Teacher類的對象,「new」關鍵字會調用Teacher類的構造函數來 完成對象的建立,並返回這個對象 的地址,再將這個返回的對象地址賦值給pMrChen指針,這樣就同時完成了對象 的建立和指針的賦值。
有了指向對象的指針,就能夠利用「-->」運算符,經過指針訪問該對象 的成員。
要特別注意的是,跟普通的變量不一樣,使用new關鍵字建立的對象沒法在結束其生命週期的時候自動銷燬,因此必須使用「delete」關鍵字銷燬這個對象,釋放其佔用的內存。
如: delete pMrChen;
"delete"首先會調用Teacher類的析構函數~Teacher()完成這個對象特有的清理工做,而後釋放掉這個對象佔有的內存,整個對象也就銷燬了。