在C++中, 用 "類" 來描述 "對象", 所謂的"對象"是指現實世界中的一切事物。那麼類就可以看做是對相似事物的抽象, 找到這些不同事物間的共同點, 如自行車和摩托車, 首先他們都屬於"對象", 並且具有一定得相同點, 和一些不同點, 相同點如他們都有質量、都有兩個輪子, 都是屬於交通工具等。"都有質量"、"兩個輪子"屬於這個對象的屬性, 而"都能夠當做交通工具"屬於該對象具有的行爲, 也稱方法。
類是屬於用戶自定義的數據類型, 並且該類型的數據具有一定的行爲能力, 也就是類中說描述的方法。通常來說, 一個類的定義包含兩部分的內容, 一是該類的屬性, 另一部分是它所擁有的方法。以 "人類" 這個類來說, 每個人都有自己的姓名、年齡、出生日期、體重等, 爲 人類 的屬性部分, 此外, 人能夠吃飯、睡覺、行走、說話等屬於人類所具有的行爲。
上面舉例中所描述的 "人" 類僅僅是具有人這種對象的最基礎的一些屬性和行爲, 可以稱之爲人的"基類"。 再說說一些具有一些職業的人, 例如學生, 一個學生還具有"基類"中所沒有的屬性, 如學校、班級、學號; 也可以具有基類所不具有的行爲, 如每天需要去上課, 需要考試等。
學生類可以看做是基類的一個擴展, 因爲他具有基類的所有屬性和行爲, 並且在此基礎上增加了一些基類所沒有的屬性和行爲, 像"學生"這樣的類稱爲"人類"這個基類的"派生類"或者"子類"。在學生的基礎上海可以進一步的擴展出其他更高級的類, 如"研究生"類。
到此, 我們不再更深的去介紹類的其他相關知識。
二、C++類的定義
C++中使用關鍵字 class 來定義類, 其基本形式如下:
說明:
①. 類名 需要遵循一般的命名規則;
②. public 與private 爲屬性/方法限制的關鍵字, private 表示該部分內容是私密的, 不能被外部所訪問或調用, 只能被本類內部訪問; 而 public 表示公開的屬性和方法, 外界可以直接訪問或者調用。
一般來說類的屬性成員都應設置爲private, public只留給那些被外界用來調用的函數接口, 但這並非是強制規定, 可以根據需要進行調整;
③. 結束部分的分號不能省略。
類定義示例:
定義一個點(Point)類, 具有以下屬性和方法:
■ 屬性: x座標, y座標
■ 方法: 1.設置x,y的座標值; 2.輸出座標的信息。
實現代碼如下:
代碼說明:
上段代碼中定義了一個名爲 Point 的類, 具有兩個私密屬性, int型的xPos和yPos, 分別用來表示x點和y點。在方法上,setPoint 用來設置屬性, 也就是 xPos 和 yPos 的值;printPoint 用來輸出點的信息。
類在定義時有以下幾點需要注意:
①. 類的數據成員中不能使用 auto、extern和register等進行修飾, 也不能在定義時進行初始化, 如int xPos = 0;//錯;
②. 類定義時 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
Process returned 0 (0x0) execution time : 0.406 s
Press any key to continue.
與類的定義相比, 在類內實現成員函數不再是在類內進行聲明, 而是直接將函數進行定義, 在類中定義成員函數時, 編譯器默認會爭取將其定義爲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) 這種形式, 其返回類型、成員函數名、參數列表都要與類內聲明的形式一致。
四、C++類的使用
將一個類定義並實現後, 就可以用該類來創建對象了, 創建的過程如同 int、char 等基本數據類型聲明一個變量一樣簡單, 例如我們有一個Point類, 要創建一個Point的對象只需要:
Point 對象名;
創建一個類的對象稱爲該類的實例化, 在創建時我們還可以對對象的屬性進行相關的初始化, 這樣在創建完成後該對象就已經具有了一定得屬性, 這種創建方式將在下一篇博文中進行學習。
將類進行實例化後系統纔會根據該對象的實際需要分配一定的存儲空間。這樣就可以使用該對象來訪問或調用該對象所能提供的屬性或方法了。
還以上面的代碼爲例, 爲了減少篇幅, 我們把 Point 類的實現放在 Point.h 頭文件中, 這裏不再貼出 Point 類的實現代碼。
#include <iostream>
#include "Point.h"
using namespace std;
int main()
{
Point M; //用定義好的類創建一個對象 點M
M.setPoint(10, 20); //設置 M點 的x,y值
M.printPoint(); //輸出 M點 的信息
cout<< M.xPos <<endl; //嘗試通過對象M訪問屬性xPos
return 0;
}
代碼在編譯時會出現錯誤, 提示error: 'int Point::xPos' is private, 這是cout<< M.xPos <<endl; 這行造成的, 他試圖訪問一個 private 對象中的私密數據xPos,
如果將這行去掉便可正常運行。
通過 對象名.公有函數名(參數列表); 的形式就可以調用該類對象所具有的方法, 通過對象名.公有數據成員; 的形式可以訪問對象中的數據成員。
五、對象的作用域、可見域與生存週期
類對象的作用域、可見域以及生存週期與普通變量的保持相同, 當對象生存週期結束時對象被自動撤銷, 所佔用的內存被回收, 需要注意的是, 如果對象的成員函數中有使用new 或者malloc 申請的動態內存程序不會對其進行釋放, 需要我們手動進行清理,
否則會造成內存泄露。
--------------------
本文轉載自:http://www.cnblogs.com/mr-wid/archive/2013/02/18/2916309.html
六、類的成員函數
1、純虛函數
純虛函數的定義形式:virtual { } = 0;
- 含有純虛函數的類被稱爲抽象類(abstract class),此種類不能被實例化