天天看點

C++ 類的定義與實作

一、"類" 的介紹

    在C++中, 用 "類" 來描述 "對象", 所謂的"對象"是指現實世界中的一切事物。那麼類就可以看做是對相似事物的抽象, 找到這些不同僚物間的共同點, 如自行車和機車, 首先他們都屬于"對象", 并且具有一定得相同點, 和一些不同點, 相同點如他們都有品質、都有兩個輪子, 都是屬于交通工具等。"都有品質"、"兩個輪子"屬于這個對象的屬性, 而"都能夠當做交通工具"屬于該對象具有的行為, 也稱方法。

    類是屬于使用者自定義的資料類型, 并且該類型的資料具有一定的行為能力, 也就是類中說描述的方法。通常來說, 一個類的定義包含兩部分的内容, 一是該類的屬性, 另一部分是它所擁有的方法。以 "人類" 這個類來說, 每個人都有自己的姓名、年齡、出生日期、體重等, 為 人類 的屬性部分, 此外, 人能夠吃飯、睡覺、行走、說話等屬于人類所具有的行為。

    上面舉例中所描述的 "人" 類僅僅是具有人這種對象的最基礎的一些屬性和行為, 可以稱之為人的"基類"。 再說說一些具有一些職業的人, 例如學生, 一個學生還具有"基類"中所沒有的屬性, 如學校、班級、學号; 也可以具有基類所不具有的行為, 如每天需要去上課, 需要考試等。

    學生類可以看做是基類的一個擴充, 因為他具有基類的所有屬性和行為, 并且在此基礎上增加了一些基類所沒有的屬性和行為, 像"學生"這樣的類稱為"人類"這個基類的"派生類"或者"子類"。在學生的基礎上海可以進一步的擴充出其他更進階的類, 如"研究所學生"類。

    到此, 我們不再更深的去介紹類的其他相關知識。

二、C++類的定義

    C++中使用關鍵字 class 來定義類, 其基本形式如下:

class 類名
{
public:
//公共的行為或屬性
private:
//公共的行為或屬性
};      

說明:

        ①. 類名 需要遵循一般的命名規則;

        ②. public 與 private 為屬性/方法限制的關鍵字, private 表示該部分内容是私密的, 不能被外部所通路或調用, 隻能被本類内部通路; 而 public 表示公開的屬性和方法, 外界可以直接通路或者調用。

            一般來說類的屬性成員都應設定為private, public隻留給那些被外界用來調用的函數接口, 但這并非是強制規定, 可以根據需要進行調整;

        ③. 結束部分的分号不能省略。

三、C++類的實作

    在上面的定義示例中我們隻是定義了這個類的一些屬性和方法聲明, 并沒有去實作它, 類的實作就是完成其方法的過程。類的實作有兩種方式, 一種是在類定義時完成對成員函數的定義, 另一種是在類定義的外部進行完成。

    1>. 在類定義時定義成員函數

        成員函數的實作可以在類定義時同時完成, 如代碼:

#include <iostream>
using namespace std;
class Point
{
public:
    void setPoint(int x, int y) //實作setPoint函數
    {
        xPos = x;
        yPos = y;
    }
    void printPoint() //實作printPoint函數
    {
        cout<< "x = " << xPos << endl;
        cout<< "y = " << yPos << endl;
    }
private:
    int xPos;
    int yPos;
};
int main()
{
    Point M; //用定義好的類建立一個對象 點M
    M.setPoint(10, 20); //設定 M點 的x,y值
    M.printPoint(); //輸出 M點 的資訊
    return 0;
}      

運作輸出:

x = 10
y = 20      

與類的定義相比, 在類内實作成員函數不再是在類内進行聲明, 而是直接将函數進行定義, 在類中定義成員函數時, 編譯器預設會争取将其定義為 inline 型函數 2>. 在類外定義成員函數

        在類外定義成員函數通過在類内進行聲明, 然後在類外通過作用域操作符 :: 進行實作, 形式如下:

傳回類型 類名::成員函數名(參數清單)
{
//函數體
}
#include <iostream>
using namespace std;
class Point
{
public:
    void setPoint(int x, int y); //在類内對成員函數進行聲明
    void printPoint();
private:
    int xPos;
    int yPos;
};
void Point::setPoint(int x, int y) //通過作用域操作符 '::' 實作setPoint函數
{
    xPos = x;
    yPos = y;
}
void Point::printPoint() //實作printPoint函數
{
    cout<< "x = " << xPos << endl;
    cout<< "y = " << yPos << endl;
}
int main()
{
    Point M; //用定義好的類建立一個對象 點M
    M.setPoint(10, 20); //設定 M點 的x,y值
    M.printPoint(); //輸出 M點 的資訊
    return 0;
}      

依 setPoint 成員函數來說, 在類内聲明的形式為 void setPoint(int x, int y); 那麼在類外對其定義時函數頭就應該是 void Point::setPoint(int x, int y) 這種形式, 其傳回類型、成員函數名、參數清單都要與類内聲明的形式一緻。

四、對象的作用域、可見域與生存周期

    類對象的作用域、可見域以及生存周期與普通變量的保持相同, 當對象生存周期結束時對象被自動撤銷, 所占用的記憶體被回收, 需要注意的是, 如果對象的成員函數中有使用 new 或者 malloc 申請的動态記憶體程式不會對其進行釋放, 需要我們手動進行清理, 否則會造成記憶體洩露。

作者:王陸

繼續閱讀