面向對象程序設計的4個主要特點是什么?
抽象
封裝
繼承
多態
類和對象體現了抽象和封裝
基於以上四點的程序稱為面向對象的程序設計。
什么是類?
前邊我們學習過c++中的結構體,struct的使用是先聲明,然后定義一個該結構體的變量,最后再初始化(賦值)
其實結構體的聲明當中有很多不同數據類型的成員,在一個結構體當中,這就是對屬性的封裝,但是結構體與類相比較,還缺少了一個重要的環節,結構體當中只有屬性,只封裝了屬性,但沒有封裝相應的操作,也就是沒有封裝操作成員屬性的函數。
類當中有兩個方面,一是封裝屬性,二是封裝函數。在自己聲明的類當中要既有屬性又有函數,這就是類。
什么是對象?
在結構體中聲明一個結構體就相當於我們設計了一個類,定義一個結構體就相當於我們定義了一個對象
比如 聲明一個結構體相當於封裝了一個類(但缺少相應的操作)
struct Student{
private int num;
string name;
float score;
string address;
這里如果再有函數就是一個類了
};
定義給兩個結構體,相當於我們定義了兩個對象
Student student1,student2;
初始化結構體,相當於對象的初始化
客觀世界中任何一個事物都可以看成一個對象(Object),對象可以是自然物體(如汽車、狗熊)也可以是一種邏輯(如班級、連隊)。
任何一個對象都有兩個要素:一個是靜態特征,如班級專業,班級人數,所在教室,這種靜態特征稱為屬性。
一個是動態特征,如班級學習、班級開會、班級體育比賽,這種動態特征稱為行為(或功能)。
封裝的意義?
把一部分或全部屬性和部分功能(函數)對外界屏蔽,就是從外界(類的大括號之外)看不到,不可知,這就是封裝的意義。
實際上就是用了一個后邊會介紹的關鍵字 private 私有化關鍵字來完成,就是隱蔽,比如賬號的密碼,你如果玩網絡游戲,你的賬號密碼別人都可以看到,訪問,所以要把它封裝。
封裝兩個方面的含義:一是將有關數據和操作代碼封裝在對象當中,形成一個基本單位,各個對象之間相對獨立互不干擾。
二是將對象中某些屬性和操作私有化,已達到數據和操作信息隱蔽,有利於數據安全,防止無關人員修改。
類與對象之間的關系是什么?
程序設計當中,常用到抽象這個詞,這個詞就是解釋類與對象之間關系的詞。
類與對象之間的關系就是抽象的關系。
一句話來說明:類是對象的抽象,而對象則是類得特例,即類的具體表現形式。
舉例說明上面的那句話:
我們都是人類,人類是不是有自己的屬性,屬性有年齡、名字、ID、性別,人類是不是有功能,即操作能力,能說話、能吃飯、能睡覺,能思考解決問題。
我們大家都是人類,我們彼此卻又不相同,我們每一個人具有自己的屬性的能力,每一個人就是人類的某一個對象。
把我們共同的屬性和功能向上抽取,這就是抽象,抽象程一個人類。
繼承
面向對象的繼承是為了軟件重用,簡單理解就是代碼復用,把重復使用的代碼精簡掉的一種手段。
如何精簡,當一個類中已經有了相應的屬性和操作的代碼,而另一個類當中也需要寫重復的代碼,那么就用繼承方法,把前面的類當成父類,后面的類當成子類,子類繼承父類,理所當然。就用一個關鍵字extends就完成了代碼的復用。
多態
沒有繼承就沒有多態,繼承是多態的前提。
舉例來說明多態
貓、狗、鳥都是動物
動物不同於植物,貓、狗、鳥都可以叫、都可以吃
這些功能可以同時繼承自動物類,貓類、狗類、鳥類都是動物類的子類
但是貓的叫聲是“喵喵喵” ,狗的叫聲是“汪汪汪”,鳥的叫聲是“吱吱支”
貓愛吃魚,狗愛吃骨頭,鳥愛吃蟲子
這就是雖然繼承自同一父類,但是相應的操作卻各不相同,這叫多態。
由繼承而產生的不同的派生類,其對象對同一消息會做出不同的響應。
知道了以上概念就可以進行面向對象編程(Object Oriented Programming,簡稱OOP)
現在開始聲名一個學生類:
class Student{
int num;
string name;
char sex;
void display(){
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
};
封裝一個類,然后用這個類定義兩個對象
Student student1,student2;
如果是重要或是私有的信息,不讓外界知道,可以進行私有化處理:
class {
private:
int num;
string name;
char sex;
public:
void display(){
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
}student1,student2;
在C++中如果不定義private和public,則系統默認為是私有。
還可以用無名類來定義對象,必須要求封裝類之后同時定義對象。
對象成員的引用或初始化
私有化的不可以這樣寫
不能 student1.num=100001;student1.name=”張三";針對於public:
對象調用函數 student1.display();