《現代c++程序設計》(美)Barbara Johnston----2:類和對象 C++中的頭文件和源文件

「這項工做有誰來完成」這個問題對於設計類和使用對象來講很是重要。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()完成這個對象特有的清理工做,而後釋放掉這個對象佔有的內存,整個對象也就銷燬了。

相關文章
相關標籤/搜索