侯捷C++面向對象

頭文件中需要加入防衛聲明

#ifndef XXX
#define XXX

#endif

類的構造函數中,使用列表初始化初始化對象的數據成員

區別:變量的設定,初始化,賦值,使用列表初始化等於在初始化就將值放進去,如果在大括號裏面寫的話,等於放棄了初始化的階段,直接在賦值階段設定對象數據成員的值,後者的效率比前者差

類一般分兩類:一類帶指針,一類不帶指針,不帶指針的類大多不用寫析構函數

C語言不允許函數重載,C++可以函數重載,構造函數可以有多個,函數重載的實質是編譯器會把它們視爲名稱不同的函數

構造函數放在private的作用:singleton設計模式,將構造函數放在private中,單例模式,不能在類外中創建對象

常量成員函數:在函數聲明後面加const,不會改變數據內容的成員函數應該加上const ;如果是一個對象是const對象,如果調用設計數據成員的函數,而這個函數不是const成員函數,此時編譯器會報錯

const可以將同一個成員函數區分開

當成員函數的const和non-const版本同時存在時,const object只能調用const版本,non-const版本只會調用non-const版本

值傳遞和引用傳遞(參數傳遞):養成使用引用傳遞的習慣,傳引用的速度會更快,const引用可以防止錯誤修改引用的參數中的內容

返回值和返回引用(返回值傳遞):返回值的傳遞也儘量返回引用;

參數的傳遞和返回值的傳遞都儘量使用引用傳遞,原因跟速度和效率有關,傳遞者無需知道接受者是以引用的的方式接受參數

友元:相同的類的各個對象是互爲友元 

引用的底層實現可以看作指針

帶指針的類,String類就是一個典型的帶指針的類,可以根據string的大小來使用指針分配空間

拷貝構造和拷貝賦值,如果自己不定義,編譯器將使用默認的拷貝構造和拷貝賦值,在帶指針的類中使用默認的拷貝構造和拷貝賦值,將會產生錯誤,默認的拷貝構造和拷貝賦值在帶指針的類當中將會直接複製指針,導致拷貝或者被賦值的那部分直接指向原有指針指向的內容,這並不是真正意義上的拷貝和賦值,

String s3(s1)//拷貝構造
s3=s2//拷貝賦值
//它們在類中的定義
String(const String& str)
String& operator=(const String& str)

編譯器默認的拷貝構造和賦值拷貝都是淺拷貝

拷貝賦值函數要檢測自我賦值,若出現自我賦值的情況直接返回this

stack:棧對象在作用域結束後被自動清除,它的析構函數會被自動調用

global object:作用域爲整個程序

local static object:靜態對象,它的生命週期爲整個程序,不會在作用域結束後被清理

heap:堆對象的生命在delete之後結束,堆的內存空間由指針來控制,出現內存泄漏的一種情況是,指向一塊堆空間的指針的生命週期在作用域之後結束,但是在作用域結束之前沒有使用delete回收這塊堆空間,因此在作用域之後,這塊堆空間就結束了

new:分配內存malloc(內存的大小),類型轉換,調用類的構造函數

delete:先調用析構函數,再釋放內存free(pointer)

不用太care哪些函數可以寫成inline哪些不可以寫成inline,將所有寫成inline

成員函數只有一份拷貝,non-static members通過this指針來調用不同對象的數據,static data member只有一份拷貝,相同類的所有對象都使用這份拷貝,static member function,它沒有this指針,用於對static data member進行操作

類和類之間的關係:複合,繼承,委託

複合:has-a,即一個類擁有另外一個類;複合關係下的構造和析構,構造過程是由內而外,析構是由外而內

委託:跟複合有點像,但委託關係中,一個類擁有另外一個類,但這種擁有關係比較虛,擁有的是相應的類的指針,至於什麼時候真正擁有這個類並不確定,它們之間的關係通過指針連接,它們的生命週期就不同步,這一點跟複合關係不一樣

繼承:is-a,public,private,protected繼承

繼承關係下的構造和析構:構造由內而外,析構由外而內,基類的析構函數是要virtual的

non-virtual函數:不希望子類派生類重新定義它(overwrite)

virtual函數:希望派生類,子類重新定義它,它已有默認定義

pure-virtual函數:希望子類或者派生類一定要重新定義這個函數,對它沒有定義

virtual void draw()=0 const;//pure virtual 
virtual void error();//impure virtual
int studentID() const;//not virtual 

繼承加複合關係下的構造和析構:

仿函數類,function-like classes

 explict關鍵字:告訴編譯器不要隱式調用構造函數

智能指針裏面會包含有普通指針

引用和它代表的對象大小相同,地址也相同;引用大多用在參數傳遞中,返回值的傳遞中 

繼承中,子類繼承的是成員函數的調用權

虛指針(vptr):每一個類都帶有一根虛指針,虛指針指向一個虛表

虛表(vtbl):虛表中存放着類中虛函數的地址,指示類中的虛函數應該調用哪個版本,若一個子類沒有改寫父類的虛函數,則它虛表中的這個虛函數這一項指向父類的相應的虛函數;若子類改寫了父類當中的虛函數,則指向子類改寫之後的虛函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章