第0講 面向對象技術概述
面向對象程序的特點
1、開發時間短,效率高,可靠性高,所開發的程序更強壯
2、重用,共享,可維護性,精簡
3、適合於大程序長時間的開發工作
面向對象程序設計是一種以對象爲基礎,以事件或消息來驅動對象執行處理的程序設計技術。
OOP的四個基本特徵
抽象:對具體對象(問題)進行概括,抽出這一類對象的公共性質並加以描述的過程。(數據抽象&&代碼抽象)
封裝:將抽象出的數據及方法結合爲一個整體的信息隱蔽技術。
繼承:對具有層次關係的類的數據和操作進行共享的一種方式。
多態:不同的對象接受同一消息時產生不同的行動的現象。(重載函數和虛函數)
消息(Message)是描述事件發生的信息,它是對象之間發出的行爲請求。
第一二講 C++基礎
1、C++變量存儲類型
<存儲類型> <變量類型> <變量列表>
auto存儲類
Ø屬於一時性存儲,其存儲空間可以被若干變量多次覆蓋使用。
register存儲類
Ø存放在通用寄存器中。
extern存儲類
Ø在所有函數(該.c文件外)和程序段中都可引用。
static存儲類
Ø在內存中是以固定地址存放的,在整個程序運行期間都有效。
2、位運算--移位
1、左移運算(<<)
左移後,低位補0,高位捨棄。
2、右移運算(>>)
右移後,低位:捨棄
高位:無符號數:補0
有符號數: 補“符號位”
3、枚舉類型
只要將需要的變量值一一列舉出來,便構成了一個枚舉類型。
枚舉類型的聲明形式如下:
enum 枚舉類型名 {變量值列表};
例如:
enum weekday {sun, mon, tue, wed, thu, fri, sat};
注意!sun沒有引號
4、常量指針
const 它限定一個變量不允許被改變,產生靜態作用。
常量: const int Number = 1
指向常量的指針:不能通過指針來改變所指對象的值,但指針本身可以改變,可以指向另外的對象。
例:
int n1=3;
int const n2=5;
const int *pn= &n1;
pn=&n2; //正確
*pn=6; //錯誤
若聲明指針常量,則指針本身的值不能被改變。例:
int n1=3;
int const n2=5;
int *const pn= &n1;
pn=&n2; //錯誤
*pn=6; //正確
5、動態內存分配
c_point = new char[37]; //動態分配數組
delete [ ] c_point; //釋放數組
6、整行輸入字符串
cin.getline(字符數組名St, 字符個數N, 結束符);
7、字符串處理函數
strcat(連接),strcpy(複製),
strcmp(比較),strlen(求長度),
strlwr(轉換爲小寫),
strupr(轉換爲大寫)
頭文件<string.h>
第三講 類與對象
1、private是缺省權限
2、protected與private類似,其差別表現在繼承與派生時對派生類的影響不同,只允許本類中的函數訪問,而類外部的任何函數都不能訪問。
3、內聯成員函數:
在類中聲明內聯成員函數的方式:
Ø將函數體放在類的聲明中(隱式調用)
Ø使用inline關鍵字,聲明和實現都需要加上inline函數(顯式調用)
4、構造函數與類名同名,且不能指定返回值類型,允許重構
5、拷貝構造函數是一種特殊的構造函數,其形參爲本類的對象引用。作用:使用一個對象(參數指定的對象),去初始化一個正在被建立的同類型對象
class 類名
{
public :
類名(形參);//構造函數
類名(類名 & 對象名);//拷貝構造函數
...
};
6、拷貝構造函數調用的三個情況
-
用類的一個對象去初始化該類的另一個對象時系統自動調用它實現拷貝賦值
-
函數的形參爲類對象,調用函數時,實參賦值給形參,系統自動調用拷貝構造函數
-
函數的返回值是類對象時,系統自動調用拷貝構造函數
!注意!函數形參爲類對象的引用或指針,不會調用拷貝構造函數
7、析構函數
1、析構函數沒有返回值,沒有重載函數,有且只有一個
2、且必須是public訪問權限
3、不能隨意調用,只有在類對象的生命週期結束的時候由系統自動調用。
8、類的靜態成員static
1、某個類的所有對象爲靜態成員分配一個共享存儲空間。
2、使用全局變量會不安全
3、不管定義多少個對象,這個靜態成員只有一個實例
4、靜態成員必須初始化
5、調用公有靜態成員時,可採用如下格式之一:
Ø<類名>::<靜態成員>
Ø對象.<靜態成員>
Ø 對象指針->靜態成員
6、靜態成員函數可以直接訪問該類的靜態數據和靜態函數成員,但不能隨意訪問類的非靜態數據成員
9、友元
1、不改變其訪問權限,但是又需要類外的函數直接訪問其類的私有數據或其他數據
2、u友元函數和友元類在被訪問的類中聲明,其格式分別如下:
friend <返回值類型> <函數名>(<參數表>);
friend <類名>;
10、this指針
1、靜態成員不能訪問this指針
第四講 繼承與派生
1、繼承方式:
不同繼承方式的影響主要體現在:
1、派生類成員對基類成員的訪問控制。(派生類內部)
2、派生類對象對基類成員的訪問控制。(派生類外部)
2、公有繼承
原有類型保持不變,派生類成員不能訪問private,派生對象只能訪問public成員(類對象本來就不能訪問protected成員)
3、私有繼承(private)
public和protected變成private,基類private成員不可訪問,成員函數可以訪問public和protected成員,通過派生類的對象不能訪問基類中的任何成員。
4、保護繼承
基類的public和protected成員都以protected身份出現在派生類中,基類的private成員不可訪問,派生類中的成員函數可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。通過派生類的對象不能訪問基類中的任何成員。
5、保護成員特點
- 對建立其所在類對象的模塊來說(水平訪問時),它與 private 成員的性質相同。
- 對於其派生類來說(垂直訪問時),它與 public 成員的性質相同。
- 既實現了數據隱藏,又方便繼承,實現代碼重用。
6、構造函數調用次序
1. 調用基類構造函數,調用順序按照它們被繼承時聲明的順序(從左向右)。
2. 調用成員對象的構造函數,調用順序按照它們在類中聲明的順序。
3. 派生類的構造函數體中的內容。
7、虛繼承
解決多繼承時候的成員二義性
B1,B2繼承於B,同時C繼承與B1,B2,這時候,需要在B1,B2繼承於B時,都加上虛繼承
class B1 : virtual public B
{
private:
int k1;
};
而C中無需加入關鍵字virtual
構造順序:
步驟:先根據繼承聲明順序將所有虛基類排序;其次構造這些虛基類;最後按繼承聲明順序構造非虛基類。
!虛繼承B只會構造一次,但是假如沒有申明是虛繼承,會構造多次
8、賦值兼容原則
一個公有派生類的對象在使用上可以被當作基類的對象,反之則禁止。具體表現在:
Ø派生類的對象可以被賦值給基類對象。
Ø派生類的對象可以初始化基類的引用。
Ø指向基類的指針也可以指向派生類。