1. 程式人生 > >C++類(class)的定義與實現

C++類(class)的定義與實現

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

    類是屬於使用者自定義的資料型別, 並且該型別的資料具有一定的行為能力, 也就是類中說描述的方法。通常來說, 一個類的定義包含兩部分的內容, 一是該類的屬性, 另一部分是它所擁有的方法

。以 "人類" 這個類來說, 每個人都有自己的姓名、年齡、出生日期、體重等, 為 人類 的屬性部分, 此外, 人能夠吃飯、睡覺、行走、說話等屬於人類所具有的行為。

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

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


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



二、C++類的定義

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

  1. class 類名
  2. {
  3. public:
  4. //公共的行為或屬性
  5. private:
  6. //公共的行為或屬性
  7. };

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

        ②. public 與 private 為屬性/方法限制的關鍵字, private 表示該部分內容是私密的, 不能被外部所訪問或呼叫, 只能被本類內部訪問; 而 public 表示公開的屬性和方法, 外界可以直接訪問或者呼叫。


            一般來說類的屬性成員都應設定為private, public只留給那些被外界用來呼叫的函式介面, 但這並非是強制規定, 可以根據需要進行調整;

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

三、C++類的實現
    在上面的定義示例中我們只是定義了這個類的一些屬性和方法宣告, 並沒有去實現它, 類的實現就是完成其方法的過程。類的實現有兩種方式, 一種是在類定義時完成對成員函式的定義, 另一種是在類定義的外部進行完成。

    1>. 在類定義時定義成員函式
        成員函式的實現可以在類定義時同時完成, 如程式碼:

  1. #include <iostream>
  2. using namespace std;
  3. class Point
  4. {
  5. public:
  6. void setPoint(int x, int y) //實現setPoint函式
  7. {
  8. xPos = x;
  9. yPos = y;
  10. }
  11. void printPoint() //實現printPoint函式
  12. {
  13. cout<< "x = " << xPos << endl;
  14. cout<< "y = " << yPos << endl;
  15. }
  16. private:
  17. int xPos;
  18. int yPos;
  19. };
  20. int main()
  21. {
  22. Point M; //用定義好的類建立一個物件 點M
  23. M.setPoint(10, 20); //設定 M點 的x,y值
  24. M.printPoint(); //輸出 M點 的資訊
  25. return 0;
  26. }


執行輸出:

x = 10
        y = 20

與類的定義相比, 在類內實現成員函式不再是在類內進行宣告, 而是直接將函式進行定義, 在類中定義成員函式時, 編譯器預設會爭取將其定義為 inline 型函式 2>. 在類外定義成員函式
        在類外定義成員函式通過在類內進行宣告, 然後在類外通過作用域操作符 :: 進行實現, 形式如下:
返回型別 類名::成員函式名(引數列表)
{
     //函式體
}
  1. #include <iostream>
  2. using namespace std;
  3. class Point
  4. {
  5. public:
  6. void setPoint(int x, int y); //在類內對成員函式進行宣告
  7. void printPoint();
  8. private:
  9. int xPos;
  10. int yPos;
  11. };
  12. void Point::setPoint(int x, int y) //通過作用域操作符 '::' 實現setPoint函式
  13. {
  14. xPos = x;
  15. yPos = y;
  16. }
  17. void Point::printPoint() //實現printPoint函式
  18. {
  19. cout<< "x = " << xPos << endl;
  20. cout<< "y = " << yPos << endl;
  21. }
  22. int main()
  23. {
  24. Point M; //用定義好的類建立一個物件 點M
  25. M.setPoint(10, 20); //設定 M點 的x,y值
  26. M.printPoint(); //輸出 M點 的資訊
  27. return 0;
  28. }


依 setPoint 成員函式來說, 在類內宣告的形式為 void setPoint(int x, int y); 那麼在類外對其定義時函式頭就應該是 void Point::setPoint(int x, int y) 這種形式, 其返回型別、成員函式名、引數列表都要與類內宣告的形式一致。

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