C語言和C++是兩種密切相關但又有明顯區別的程式語言。C++是在C語言的基礎上發展起來的,它不僅完全相容C語言,還增加了物件導向程式設計、泛型程式設計等特性。
-
C語言與C++的區別:
- C語言是一種程序式程式設計語言,而C++是支援多正規化程式設計的語言,包括程序式程式設計、物件導向程式設計和泛型程式設計。
- C++支援類和物件,提供了封裝、繼承和多型等物件導向的特性。
- C++支援模板,允許泛型程式設計。
- C++支援異常處理。
- C++支援新的資料型別,如bool、wchar_t等。
-
程序導向與物件導向的區別:
- 程序導向強調的是函式和過程,程式由一系列函式呼叫組成。
- 物件導向強調的是物件和訊息,程式由物件的互動組成。
- 物件導向提供了更好的程式碼複用性和模組化。
-
C++新語法(儲存結構):
- 引用:引用是某個已存在變數的另一個名字,它本身不佔用記憶體空間。
- 特點:引用必須在定義時被初始化,一旦初始化後不能改變其指向。
-
右值引用(C++11特性):
- 右值引用允許程式設計師直接操作即將銷燬的物件的資源,常用於移動語義和完美轉發。
-
引用與指標的區別:
- 引用是某個變數的別名,一旦初始化後不能改變其指向。
- 指標是一個變數,儲存了另一個變數的地址,可以改變其指向。
-
引用陣列:
- 陣列的引用實質上是一個指向陣列首元素的指標。
-
bool型別:
- bool是C++中新增的資料型別,用於表示布林值true和false。
語法規則:
- 命名規則:識別符號只能包含字母、數字和下劃線,且不能以數字開頭。
- 作用域:
- 函式原型作用域:函式原型中定義的變數僅在該函式原型中可見。
- 區域性作用域:在函式內部定義的變數僅在該函式內部可見。
- 類作用域:在類中定義的成員僅在該類內部可見。
- 名稱空間作用域:在名稱空間中定義的名稱僅在該名稱空間中可見。
- 作用域與可見性問題:作用域決定了變數的可見性和生命週期。
- 關鍵字使用:
- extern:用於宣告全域性變數或函式,可以被多個檔案共享。
- static:用於宣告區域性靜態變數或靜態成員變數,其生命週期貫穿整個程式。
過載:
- 過載:函式名相同,但引數列表不同。
- 重寫:派生類中重寫基類的虛擬函式。
- 友元:友元函式或友元類可以訪問類的私有和保護成員。
- 函式過載:在同一個作用域內,函式名相同但引數列表不同。
- 二義性問題:當函式呼叫不明確時,編譯器無法確定呼叫哪個函式。
- 運算子過載:
- 友元運算子過載:作為類的友元函式過載運算子。
- 成員函式運算子過載:作為類的成員函式過載運算子。
- 不可過載的運算子:如
.
、::
、.*
和?:
等。
函式預設引數:
- 語法:在函式定義時為引數指定預設值。
- 特性:簡化函式呼叫。
- 二義性問題:當函式呼叫可以匹配多個過載版本時,會產生二義性。
行內函數:
- 宣告形式:使用
inline
關鍵字宣告。 - 工作原理:在編譯時將函式體插入到每個呼叫點,減少函式呼叫的開銷。
- 遞迴:行內函數通常不用於遞迴,因為遞迴會增加程式碼體積。
物件導向:
- 封裝:將資料和運算元據的函式組合在一起,隱藏內部實現細節。
- 繼承:允許新類(派生類)繼承現有類(基類)的特性。
- 多型:允許不同類的物件對同一訊息做出響應。
封裝:
- 類與物件:類是物件的藍圖,物件是類的例項。
- 類的語法體系:定義瞭如何宣告類、成員變數和成員函式。
- 抽象的過程:將複雜性隱藏在介面後面。
- 封裝過程:透過訪問修飾符(public、private、protected)控制對類成員的訪問。
- 訪問許可權:控制成員的可見性和訪問性。
封裝::語法::函式:
- 建構函式:初始化物件的特殊函式。
- 複製構造:
- 使用場景:當需要透過一個物件來初始化另一個物件時。
- 深複製:逐個複製物件的每個成員。
- 淺複製:僅複製物件的指標或引用。
- 解構函式:清理物件使用的資源。
物件:
- 物件的大小:取決於物件中成員變數的大小和對齊。
- 空類物件大小:通常為1位元組,以確保不同的類型別。
- 無名物件:通常用於臨時物件,不佔用額外記憶體。
類::成員:
- 靜態(static)成員:被同類所有物件共享。
- 靜態成員的生命週期:從程式開始到程式結束。
- 靜態成員的呼叫規則:透過類名直接訪問。
- 常成員:只讀成員。
- 常資料成員:通常與初始化列表一起使用。
- 初始化引數列表:在建構函式中初始化成員變數。
- 常函式成員:使用
const
修飾的成員函式。 - this指標:指向當前物件的指標。
類的組合:
- 類的組合:一個類包含另一個類的物件。
- 建構函式的呼叫順序:先呼叫成員物件的建構函式,再呼叫包含類的建構函式。
模板:
- 函式模板:允許編寫與資料型別無關的函式。
- 類别範本:允許編寫與資料型別無關的類。
- 非型別模板:模板引數可以是非型別引數。
- 標準模板庫STL:提供了一套通用的模板類和函式。
標準模板庫:
- 六大元件:容器、迭代器、演算法、仿函式、介面卡、空間配置器。
- 容器及使用:如
vector
、list
、map
等。 - 迭代器:提供了一種訪問容器中元素的方法。
- 空間配置器及其使用:管理容器的記憶體分配。
- 演算法:如排序、搜尋等。
- 仿函式:允許函式作為引數傳遞。
- 介面卡:如迭代器介面卡、函式介面卡等。
容器:
- 序列式容器:
vector
:動態陣列,儲存連續的元素。deque
:雙端佇列,可以高效地在兩端插入和刪除。list
:雙向連結串列,可以高效地在任意位置插入和刪除。
- 關聯式容器:
set
:有序集合,不允許重複。multiset
:無序集合,允許重複。map
:鍵值對集合,鍵唯一。multimap
:鍵值對集合,鍵可以重複。
繼承:
- 什麼是繼承:一種建立新類的方式,新類繼承現有類的屬性和方法。
- 繼承的特性:傳遞性、不對稱性。
- 繼承的分類:單繼承、多繼承。
- 基類成員呼叫的函式的二義性問題:當派生類和基類有同名函式時。
- 菱形繼承:一個類繼承了兩個有共同基類的類。
- 解決菱形繼承:使用虛繼承。
- 不可被繼承:建構函式、複製建構函式、解構函式、友元、靜態成員。
- 繼承方式:public、private、protected。
- 繼承後的訪問許可權:繼承方式決定了成員在派生類中的訪問許可權。
- 繼承的構造、析構順序:先呼叫基類的建構函式,後呼叫派生類的建構函式;析構順序相反。
- 繼承與組合類:建構函式的順序。
- 模板的繼承:模板類可以被繼承。
- 基類的靜態成員被繼承的特性:不可被繼承,但可以被派生類物件共享。
- 型別相容性原則:派生類物件可以被當作基類