C++複習筆記

Britjeans發表於2018-06-02
基於物件的程式設計
物件導向程式設計有4個主要特點:抽象、封裝、繼承和多型性
class 類名
{
    private:
    私有的資料和成員函式;
    public:
    共有的而資料和成員函式;
}
member access specifier: private, public, protected
一個C++程式是由3個部分組成的:
(1)類宣告檔案(字尾為.h)
(2)類實現檔案(字尾為.cpp)
(3)類的使用檔案(字尾為.cpp),即主函式檔案
用引數初始化表對資料成員初始化
例:Box::Box(int h, int w, int len):height(h),width(w),length(len){}

解構函式(destructor)
當物件的生命期結束時,會自動執行解構函式。具體地說如果出現以下4種情況,程式就會執行解構函式:
(1)如果在一個函式中定義了一個物件(假設是自動區域性物件),當這個函式被呼叫結束時,物件應該釋放,在物件釋放前自動執行解構函式。
(2)靜態(static)區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫解構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫static區域性物件的解構函式。
(3)如果定義了一個全域性的物件,則在程式的流程離開其作用域時(如main函式結束或呼叫exit函式)時,呼叫該全域性的物件的解構函式。
(4)如果用new運算子動態地建立了一個物件,當用delete運算子釋放該物件時,先呼叫該物件的解構函式。

每個成員函式中都包含一個特殊的指標,這個指標的名字是固定的,稱為this。它是指向本類物件的指標,它的值是當前被呼叫的成員函式所在的物件的起始地址。

常物件
1.常資料成員
只能通過建構函式的引數初始化表對常資料成員進行初始化,任何其他函式都不能對常資料成員賦值。
2.常成員函式
如果將成員函式宣告為常成員函式,則只能引用本類中的資料成員,而不能修改它們。

1.指向物件的常指標
例:Time * const ptrl;
2.指向常物件的指標
例 :const char * ptrl;
(1)如果一個變數已被宣告為常變數,只能用指向常變數的指標變數指向它,而不能用一般的指標變數去指向它。
(2)指向常變數的指標變數除了可以指向常變數外,還可以指向未被宣告為const的變數去指向它。
(3)如果函式的形參是指向普通變數的指標變數,實參只能用指向普通(非const)變數的指標,而不能用指向const變數的指標,這樣,在執行函式的過程中可以改編形參指標變數所指向的變數的值。

和靜態資料成員一樣,靜態成員函式是類的一部分,而不是物件的一部分。如果要在類外呼叫公用的靜態成員函式,要用類名和域運算子。

友元
1.友元函式
如果在本類以外的其他地方定義了一個函式(這個函式可以是不屬於任何類的非成員函式,也可以是其他類的成員函式),在類體中用friend對其進行宣告,此函式就稱為本類的友元函式。
2.友元類
將B類宣告為A類的友元類,那麼友元類B中的所有函式都是A類的友元函式,可以訪問A類中的所有成員。

類别範本
例:
template <class numtype>
class Compare
{
    public :
         Compare(numtype a, numtype b) 
         {
              x=a;
              y=b;
         }
        numtype max()
        {
           return(x>y)?x:y;
        }
    private:
        numtype x,y;
};

運算子過載
過載運算子的函式一般格式如下
函式型別 operator 運算子名稱(形參表)
    {對運算子的過載處理}
過載運算子的規則
(1)C++不允許使用者自己定義新的運算子,只能對已有的C++運算子進行過載
(2)C+允許過載的運算子
(3)過載不能改變運算子運算物件(即運算元)的個數
(4)過載不能改變運算子的優先順序別
(5)過載不能改變運算子的結合性
(6)過載運算子的函式不能有預設的引數、
(7)過載的運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少一個是類物件(或類物件的引用)
(8)用於類物件的運算子一般必須過載,但有兩個例外,運算子“=”和“&”不必使用者過載

過載流插入運算子“<<”和流提取運算子“<<”
istream & operator >>(istream &, 自定義類 &)
ostream & operator <<(ostream &, 自定義類 &)

型別轉換函式
型別轉換函式的一般形式
operator 型別名()
  {實現轉換的語句}

物件導向的程式設計

繼承與派生
一個派生類只從一個基類派生,這成為單繼承(single inheritance)
一個派生類有兩個或者多個基類的稱為多重繼承(multiple inheritance)

派生類是基類的具體化,而基類是派生類的抽象

派生類成員的訪問屬性
1.公用繼承(public inheritance)
基類的公有成員和保護成員在派生類中保持著原有訪問屬性,其私有成員仍為基類私有
2.私有繼承(private inheritance)
基類的共有成員和保護成員在派生類中成了私有成員。其私有成員仍為基類私有。
3.受保護的繼承(protected inheritance)
基類的公有成員和保護成員在派生類中成了保護成員,其私有成員仍為基類私有。
保護成員的意思是:不能被外界引用,但是可以被派生類的成員引用。

派生類建構函式一般形式為
派生類建構函式名(總參數列):基類建構函式名(參數列)
    {派生類中新增資料成員初始化語句}

虛基類(virtual base class)
C++提供虛基類的方法,使得在繼承簡介共同基類時只保留一份成員
在最後的派生類中不僅要負責對其直接基類進行初始化,還要負責對虛基類初始化

多型性與虛擬函式
多型性: 向不同的物件傳送同一個訊息,不同的物件在接受時會產生不同的行為。
在C++中,多型性表現形式之一是:具有不同功能的函式可以用一個函式名,這樣就可以實現用一個函式名呼叫不同內容的函式。

虛擬函式:所謂虛擬函式,就是在基類宣告函式是虛擬的,並不是實際存在的函式,然後在派生類中才正式定義此類函式

純虛擬函式與抽象類
virtual 函式型別 函式名(引數列表)=0;



相關文章