頭文件中需要加入防衛聲明
#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):虛表中存放着類中虛函數的地址,指示類中的虛函數應該調用哪個版本,若一個子類沒有改寫父類的虛函數,則它虛表中的這個虛函數這一項指向父類的相應的虛函數;若子類改寫了父類當中的虛函數,則指向子類改寫之後的虛函數