對象:此對象,非彼對象,:-D,跟妹子無關(不過貌似也可以,,),閑言少敘,書歸正傳
我們可以把我們見到的一切事物都稱為對象。它可以有形,可以無形,可以簡單,可以復雜,但是對某一種具體的對象,比如公司。
抽象:
我們可抽象出所有公司都具有的屬性,比如公司名字,地址,所屬行業等,這些共同屬性就構成了一種類型-公司類。由此得出計算機中類的理解,面對一個具體的問題(對象),首先進行抽象,得到這類具體問題的共有性質,一般的抽象應該包括兩部分:數據抽象和行為抽象,前者描述的是對象的屬性或狀態,后者描述的是共同行為或功能。
封裝:
封裝就是將得到的數據和行為結合,形成一個有機體,也就是將數據和操作數據的函數代碼結合,形成“類”,其中的數據和函數都是類的成員。
繼承:
為了解決當前問題,我們一般會查看前人已經對這個問題的認識和研究成果,並對這些成果進行利用。這就是繼承,這有這樣才能在對問題有深入的了解。即,繼承前人的成果。
多態:
多態是程序能夠處理多種類型對象的能力,c++中通過強制多態,重載多態,類型參數多態,包含多態來實現。
類:
類是對問題的抽象描述,是對對象的相關函數和數據的封裝。我們可以從另一個簡單的角度理解類,例如,基本數據類型,像int,double等,我們聲明一個類型變量
int i;
double j;
不僅僅是聲明變量i用於存儲int類的數據,更重要的是,限定對變量的操作,比如int類型的只能進行算數和比較運算等,這說明每一種數據類型包括了數據本身的屬性和對數據的操作。因此c++中的類就可以看成是一種用戶自定義的數據類型,定義一個類之后,就可以定義該類的變量,這個變量就稱為這個類的對象(實例),這個過程也叫做類的實例化。
類的定義語法:
class 類名稱
{
public:
外部接口;
protected:
保護型成員;
private:
私有成員;
};//注意這里有一個分號喲!
其中public,protected,private 分別代表成員的不同訪問權限。注意,類中可以只聲明函數的原型,函數的實現可以在類外面定義。
example:
class clock
{
public:
void settime(int newh,int newm,int news);
void showtime();
protected:
//保護型成員;
private:
int hour,minute,scent;
}
//類函數的實現
void clock::settime(int newh,int newm,int news)
{
hour=newh;
minute=newm;
scend=news;
}
void clock::showtime()
{
cout<<hour<<":"<<minute<<“:"<<scend<<endl;
}
類成員的訪問權限:
public定義了類的外部接口,在類外部只能訪問類的public成員。
private定義了私有成員,只能被本類的成員函數訪問,類外部訪問都是非法的
protected定義了保護類型成員,類似於私有成員,差別在於對繼承過程中產生的新類的影響不同
類的成員函數
類的成員函數時類的行為,是程序算法的實現部分,是對封裝數據的操作方法。
成員函數的聲明與實現
函數的原型聲明在類中,說明了函數的參數和返回值類型,具體實現是在類之外。與普通函數不同的是,類實現函數需要指明類的名稱,形式如下:
返回值類型 類名 ::函數成員名(參數表)
{
函數體
}
另外類的成員函數也可以有默認形參值(即,函數實現的時候形參可以直接賦值)
內聯函數:這個先不寫
對象:
c++中類的對象就是類的一種實體(實例),如果將類看成是一種自定義類型,那么類的對象就可以看成是該類型的變量,形式如下:
類名 對象名;
定義了類及其對象,j就可以訪問對象的公有成員,訪問形式采用的是”.“操作符,一般形式是:
對象名.公有成員函數名(參數表) //注意不要忘記還有參數表喲!
另外還有構造函數和析構函數,構造函數的作用是在對象別處創建的時候,順便對對象進行初始化,構造函數也是類的一個成員函數,但是構造函數的函數名與類名相同,而且沒有返回值,構造函數通常被聲明為公有函數,與構造函數類似的還有拷貝構造函數,這個先不寫,等到以后學好引用后在寫。
關於析構函數,則是對象的一個清除函數,析構函數是類的公有函數,它的名稱是類名前加”~“,沒有返回值,不接受任何參數,它在對象的生存周期即將結束的時候自動調用。
最后貼出個完整的類應用程序
有一個圓形泳池,需要在其周圍建議圓形過道,並在其周圍為上柵欄,柵欄價格35/米,過道20元/平方米,道寬三米,泳池半徑鍵盤輸入,求過道和柵欄造價
// example_1_2_class_swimmingpool.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include <iostream> using namespace std; const float PI=3.1415926; const float fenceprice=35; const float concreteprice=20; class circle { public: circle(float r);//構造函數,用於初始化類值 float cirsumference(); float area(); private: float radius; };//注意類的最后有一個分號,跟在花括號之后,不常見 //類的實現 circle::circle(float r){radius=r;}//構造函數的實現 float circle::cirsumference()//計算圓的周長 { return 2 * PI * radius; } float circle::area()//計算園的面積 { return PI*radius*radius; } int _tmain(int argc, _TCHAR* argv[]) { float radius; float fencost,concretecost; cout<<"Enter the radius of the pool:"; cin>>radius; circle pool(radius); circle poolrim(radius+3); fencost=poolrim.cirsumference()*fenceprice; cout<<"fencing cost is "<<fencost<<endl; concretecost=(poolrim.area()-pool.area())*concreteprice; cout<<"concrete cost is "<<concretecost<<endl; system("pause"); return 0; }
類的組合
類的組合描述的是一個類內嵌其他類的對象作為成員的情況,它們之間的關系是包含於被包含的關系,當創建類的對象時,如果類具有內嵌對象成員,那么各個內嵌成員對象將首先被自動創建,在創建對象時,既要對本類的基本類型數據成員進行初始化,又要對內嵌對象成員初始化,因此理解這些對象的構造函數的被調用順序就很重要。
組合類構造函數的定義形式為:
類名::類名(形參表):內嵌對象1(形參表),內嵌對象2(形參表),...
{類的初始化}
其中,”內嵌對象1(形參表),內嵌對象2(形參表),...”稱作初始化列表,作用是對內嵌對象初始化,另外對基本類型的數據成員也可以這樣初始化,而且使用初始化列表比使用賦值語句的效率要高。例如上面的構造函數可以這樣寫:
circle::circle(float r):radius(r) {}
在創建組合類的對象時,不僅調用它自身的構造函數,還將調用其內嵌對象的構造函數,這時調用順序是:
首先調內嵌對象的構造函數,調用順序按照內嵌對象在組合類的定義中出現的次序,然后執行本類構造函數的函數體。
但是析構函數的調用執行順序與構造函數剛好相反。
