侯捷 C++面向物件高階開發(上)筆記整理
C++面向物件高階開發(上)
一、C++程式設計簡介
(1)基於物件:只有一個class的程式設計 object based
面向物件:幾個class的程式設計 object oriented
(2)class的經典分類:
(A)class without pointer members ——>e.g: complex 複數
(B)class with pointer members ——>e.g: string 字串
(3)class之間的關係:繼承inheritance、複合composition、委託delegation
(4)學習C++,分為學習C++語言 ,和C++標準庫
(5)C++書籍:語言的書籍《C++Primer》第五版,《C++programming Language》第四版
提高書籍:《Effective C++ THird Edition》及中文版 《The C++ Standard Library》《STL原始碼剖析》(STL是標準庫的前身)
二、標頭檔案與類的宣告
(1)標準庫以標頭檔案的形式 存在,只需要include進去就好#include <*.h>
(2)C語言 #include<stdio.h> 或者 #include<cstdio>,而 C++: #include<iostream>或者 #include<iostream.h>
(3)標頭檔案的佈局:
#ifndef __complex__
#define __complex__
*******
##endif
(4)class的佈局:
class header
class body
三、建構函式
(1)inline函式:只要成員函式在class body裡面定義,不需要顯示宣告,就是inline函式,而如果在body之外定義,要想成為inline函式,必須顯示宣告。是否成為inline函式,由編譯器來決定,即使宣告為inline function,也不一定編譯器有能力使之成為inline function。
(2)access level 訪問級別:public ,private ,protected
private:資料的部分用盡量用private
public:函式的部分,大部分用public
(3)建構函式 :建立一個物件的時候,建構函式自動被呼叫,建構函式可設定默然引數,並用冒號設定引數初始化列表:
pair(const T1& a, const T2& b) : first(a), second(b) {}
引數initializition list和在body裡對引數賦值的區別:一個是引數初始化;一個是賦值,是一個執行的過程,多了計算量;
建立一個物件,可以有引數,也可以無引數,也可動態建立:complex *p = new complex(4);
class定義了多個建構函式,就是過載overloading
(4)友元函式:
四、引數傳遞和返回值
1、資料放在private裡
2、引數用reference,是否用const
3、返回值用reference傳
4、在類的body裡的函式是否加const
5、建構函式 的 initial list
五、操作符過載與臨時物件
1,、所有的成員的函式帶有一個隱藏的引數“this”,誰呼叫這個函式誰就是 this
臨時物件 complex() ——》typename();
2、在類外
Complex Complex::operator+=(complex &c2)
這個是成員函式 operator+= 的實現,所以需要 Complex:: ,具有this指標。例如:
inline complex&
complex::operator += (const complex& r)
{
return __doapl (this, r);
}
而下面屬於運算子過載,不是成員函式的時候,就沒有Complex:: 。
inline complex
operator - (const complex& x, double y)
{
return complex (real (x) - y, imag (x));
}
六、複習Complex類的實現過程
七、三大函式:拷貝構造,拷貝複製,析構
建構函式
拷貝建構函式
拷貝賦值函式
解構函式
——》只要類帶有指標,就一定需要 拷貝建構函式 和 拷貝賦值函式
淺拷貝——》拷貝建構函式 ,淺拷貝的影響:1、造成記憶體洩漏;2、造成有兩個指標 指向同一塊記憶體
深拷貝——》拷貝賦值函式 步驟:delete ;new; strcpy;
class裡面有預設的拷貝構造和拷貝賦值函式。如果自己不定義一個拷貝建構函式,在呼叫拷貝建構函式的時候,就會呼叫預設的淺拷貝建構函式,就會造成問題,所以一定要自己定義拷貝建構函式——深拷貝。
八、堆,棧與記憶體管理
1、static local objects的生命週期
static的生命週期 :object的物件在scope結束以後仍然存在,直到整個程式結束;
非static 的生命週期:object的物件在在scope結束以後就結束了。
global objects的生命週期:
物件 objects 生命結束,就是什麼時候解構函式被呼叫:
2、new——》operator new。new動態建立物件,分三步:第一步,先轉化為operator new 函式,申請分配記憶體。第二步,做型別轉化。第三步,呼叫建構函式
delete ——》operator delete。刪除物件,分兩步:第一步,先呼叫解構函式,第二步,再呼叫operator delete函式。
3、帶中括號[ ]的new[ ]叫做array new,帶中括號[ ]的delete[ ] 叫做array delete。
動態分配所得到的陣列array:complex *p = new complex[3];
new [] ——》delete[] ——》表示呼叫幾次解構函式
new 字串 ——》delete 指標
delete[n] :array new一定要呼叫array delete,delete[n]會呼叫n次解構函式,而delete僅呼叫一次。
九、複習String類的實現過程
十、擴充套件補充:類模板,函式模板,及其他
(1)static :靜態資料 不屬於某一個物件,而非靜態的是屬於一個物件的,這種情況需要設定為靜態資料。
靜態函式 沒有this pointer,而非靜態函式有 this pointer,可以用this去取資料,靜態函式要處理資料只能處理靜態資料。
靜態資料一定要在class外面 定義。
給變數賦值,使獲得記憶體的過程叫定義。
(2)template:類模板 函式模板
(3)namespace:
十 一、組合與繼承
(1)複合composition關係下的構造和析構:構造是由內而外,析構是由外而內 has-a,即先呼叫component的建構函式,再呼叫container的建構函式。
計算記憶體的大小:複合類component的記憶體大小+container的記憶體大小
(2)委託delegation,即composition by reference:在body中宣告一個 帶指標的 另一個類 composition by reference
生命時間: classA 用一個指標指向classB,需要的時候才呼叫classB,而不是一直擁有classB。
(3)繼承Inheritance:(三種繼承方式:public protected private)is-a,繼承主要搭配虛擬函式來使用
函式的繼承:指的是繼承函式的呼叫權,子類可以呼叫父類的函式。
計算記憶體的大小:先呼叫父類的建構函式,再呼叫子類的建構函式。先呼叫子類的析構,再呼叫父類的解構函式。
十二、虛擬函式與多型
(1)虛擬函式:virtual
純虛擬函式:一定要重新定義。
(2)
(A)Inheritance + composition下的構造和析構
(B)delegation + Inheritance ——》 功能最強大的一種
十三、委託相關設計