簡介:C++並不是一個純粹的面向對象的語言,而是一種基於過程和面向對象的混合型的語言。
凡是以類對象為基本構成單位的程序稱為基於對象的程序,再加上抽象、封裝、繼承和多態就成為面向對象程序。
1.掌握類的概念、類的定義格式、類與結構的關系、類的成員屬性和類的封裝性;
2.掌握類對象的定義;
3.理解類的成員的訪問控制的含義,公有、私有和保護成員的區別。
4.能夠根據給定的要求定義類並實現類的成員函數;
何為對象?
對象兩要素:屬性和行為;
屬性對應於對象的數據;行為對應於函數;
對象之間可以通過一定的渠道相互聯系;要使某一個對象實現某一種行為(操作),應當向它傳送相應的消息。
封裝與信息隱蔽
可以對一個對象進行封裝處理,把它的一部分屬性和功能對外屏蔽,外界看不到,甚至不可知;這就是封裝。
所謂封裝有兩方面的含義:一是將有關數據和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相互獨立,互不干擾;二是將對象中的某些部分對外隱蔽,即陰部內部細節,保留少量接口,以便與外界聯系,接受外界信息。信息隱蔽有利於數據安全,防止無關的人了解和修改。
抽象:表示同一類事物的本質;類是對象的抽象,對象是類的特例,即類的具體表現形式;
繼承和軟件重用
多態
如果有幾個相似而不完全相同的對象,有時要求在向它們發出同一個消息時,它們的反應各不相同,分別執行不同的操作,這種現象就是多態;
由繼承而產生的不同的派生類,其對象對同一消息會作出不同的響應。增加程序的靈活性;
面向對象程序的特點
區別於基於過程程序設計是圍繞功能進行的,用一個函數實現一個功能。而面向對象程序設計面對的是一個個對象。把數據和有關操作封裝成一個對象。
程序設計者的任務包括兩個方面:
一是對所需的各種類和對象進行設計,即決定把哪些數據和操作封裝在一起;
二是考慮怎樣向有關對象發送消息,以完成所需的任務;
結構化程序設計:程序=算法+數據結構
面向對象程序設計:程序=對象s+消息 (對象=算法+數據結構)
類的聲明和對象的定義
類是抽象的,不占用內存;而對象是具體的,占用內存空間;
類的聲明參考 結構體的聲明;C語言結構體的定義和使用
類的成員訪問限定符:private/public/protected
private只能被本類中的成員函數引用,類外不能調用(友元類除外);默認為私有的;
public既可以被本類中的成員函數引用,也可被類的作用域內的其他函數引用,外界可調用;
protected它不能被類外訪問,但可以被派生類的成員函數訪問;
一般先寫public部分,再寫private私有部分;
類的定義方法
1/2/3
類和結構體的異同
由於C++是在C的基礎上發展的,因此C++保留了C的特性;由於C++類具有C中結構體的特性;因此結構體和類均可以聲明類;
區別是:用struct聲明的類,系統默認其數據成員public;
類的成員函數
可以是private/public
在類外定義成員函數
在類體中聲明成員函數,在類外進行定義。
class student { public: void display(); // 函數聲明 private: int num; char sex; }; void Student::display( ) //函數體 { cout<<"num:"<<num<<endl; }
::作用域限定符,聲明函數是屬於哪個類的。
類函數必須先在類體中作原型聲明,然後在類外定義;
如果一個函數體只要兩三行,一般可在類體中定義;
多於三行的函數,一般在類體內聲明,在類外定義;
內置成員函數 inline
在類體中定義的成員函數一般較小,而系統調用函數的過程所花費的時間開銷相對是比較大的。
調用一個函數的時間開銷遠遠大於小規模函數體中全部語句的執行時間;
為了減小時間開銷,如果在類體中定義的成員函數不包括循環等結構,C++系統自動地對它們作為內置函數來處理;
在程序調用這些函數時,並不是真正的執行函數的調用過程,而是把函數代碼嵌入程序的調用點。
對於類內定義的成員函數,可以省略inline;
對於在類外定義的成員函數,系統並不把它默認為內置函數;需要在聲明時用inline作顯式聲明;二者其一均可(聲明/定義時候);
如果在類體外定義inline函數,則必須將類定義和成員函數的定義都放在同一個頭文件中(寫在同一個源文件中),否則編譯時無法進行置換。
只有在類外定義的成員函數規模很小且調用頻率較高時,才指定位內置函數;
成員函數的存儲方式
同一類的不同對象中的數據成員的值一般是不相同的,而不同對象的函數的代碼是相同的,不論調用哪一個對象的函數的代碼,其實調用的都是同樣內容的代碼;
C++類中的每個對象所占用的存儲空間只是該對象的數據成員所占用的存儲空間,而不包括函數代碼所占用的存儲空間;只取決於對象中數據成員所占用的空間,與成員函數無關;
不同對象使用同一個函數代碼段,它怎麼能分別對不同對象中的數據進行的操作呢? this指針,當調用哪個對象中的函數,this指針就指向哪個對象;
注意:1)不論成員函數在類內定義還是在類外定義,成員函數的代碼段的存儲方式是相同的,都不占用對象的存儲空間;
2)不要將成員函數的這種存儲方式和inline函數的概念混淆;inline只影響程序的執行效率,與存儲方式無關;
3)從邏輯角度看成員函數,從物理角度看成員函數的存儲方式;
對象成員的引用
通過對象名和成員名運算符訪問對象中的成員;在類外只能訪問public成員;
通過指針
通過引用
類的封裝和信息隱蔽性
公用接口和私有實現的分離
在聲明類時,一般都是把所有的數據指定位私有的,使它們與外界隔離,把需要讓外界調用的成員函數指定位公開的,在類外雖然不能直接訪問私有數據成員,但可以通過調用公用成員函數來引用甚至修改私有數據;
class student { private: int num; char sex; string name; // 此行時新增的 public: void Student::display( ) //函數體 { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; //此行新增的 } };
當接口與實現(對數據的操作)分離時,只要類的接口沒有改變,對私有實現的修改不會引起程序的其他部分的修改;