1. 數(shù)據(jù)類型
1.1 內(nèi)置類型
bool、char、int、float、double、void、wchar_t
- void:無類型
- wchar_t:寬字符型,空間是和short int一樣
1.2 類型修飾符
signed、unsigned、short、long
1.3 類型別名
typedef type newname;
1.4 類型轉(zhuǎn)換
- 靜態(tài)轉(zhuǎn)換(Static Cast):相似對象之間的轉(zhuǎn)換,如:int轉(zhuǎn)float。不進行運行時類型檢查,可能會導致運行時錯誤。
- 動態(tài)轉(zhuǎn)換(Dynamic Cast):基類或派生類指針或引用。運行時進行檢查,錯誤時返回空指針或拋異常。
- 重新解釋轉(zhuǎn)換(Reinterpret Cast):將任意指針轉(zhuǎn)換到其他指針類型,也允許任意整數(shù)類型和任意指針類型之間的轉(zhuǎn)換。
- 常量轉(zhuǎn)換(Const Cast):將const類型對象轉(zhuǎn)換為非const類型對象。
2. 變量類型
除內(nèi)置數(shù)據(jù)類型,c++允許其它類型變量,如:枚舉、指針、數(shù)組、引用、數(shù)據(jù)結(jié)構(gòu)、類等。
3. 常量定義
- 使用#define預處理器
#define identifier value
- 使用const關(guān)鍵字
const type variable = value;
4. 類型限定符
- const:定義常量,值不能被修改
- volatile:變量的值可能會被程序以外的因素改變,如:硬件、其它線程
- restrict:修飾的指針是唯一一種訪問它所指向?qū)ο蟮姆绞?/li>
5. 存儲類
- auto:根據(jù)初始化表達式自動推斷該變量的類型
- register:定義寄存器變量,表示該變量被頻繁使用,可以存儲在CPU的寄存器中,非RAM,以提高程序運行效率,不能對它應用一元的 '&' 運算符(因為它沒有內(nèi)存位置)
- static:靜態(tài)變量
- extern:提供一個全局變量的引用,全局變量對所有的程序文件都是可見的
- mutable:該類中的成員變量可以在const成員函數(shù)中被修改
6. 雜項運算符:
- sizeof:返回變量大小
- Condition ? x : y:三目運算符,如:sizeof(a) 將返回 4,其中 a 是整數(shù)
- , :順序執(zhí)行一系列運算,整個逗號表達式的值是以逗號分隔的列表中的最后一個表達式的值
- . 和 ->:訪問類、結(jié)構(gòu)體的成員
- Cast:把一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型,如:int(2.2000) 將返回 2
- &:返回變量的地址,如:&a; 將給出變量的實際地址
- 指針: 指向一個變量,如:*var; 將指向變量 var
7. 循環(huán)
- while:條件為真,執(zhí)行循環(huán)
- for:多次執(zhí)行一個語句序列
- do…while:條件為真,執(zhí)行循環(huán)(循環(huán)至少執(zhí)行一次)
8. 判斷
- if…else…
- switch…case…
9. 函數(shù)參數(shù)
- 傳值調(diào)用:把參數(shù)的實際值賦給形式參數(shù),修改形式參數(shù)對實際參數(shù)沒有影響
void swap(int x, int y){
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 賦值給 x */
y = temp; /* 把 x 賦值給 y */
return;
}
- 指針調(diào)用:把參數(shù)的地址賦值給形式參數(shù),修改形式參數(shù)會影響實際參數(shù)
void swap(int *x, int *y){
int temp;
temp = *x; /* 保存地址 x 的值 */
*x = *y; /* 把 y 賦值給 x */
*y = temp; /* 把 x 賦值給 y */
return;
}
- 引用調(diào)用:把參數(shù)的引用賦值給形式參數(shù),修改形式參數(shù)會影響實際參數(shù)
void swap(int &x, int &y){
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 賦值給 x */
y = temp; /* 把 x 賦值給 y */
return;
}
10. 指針
10.1 操作符
&:訪問當前變量的地址
*:返回位于操作數(shù)所指定地址的變量的值
10.2 詳解
- NULL指針:NULL 指針是一個定義在標準庫中的值為零的常量
int *ptr = NULL;
- 指針的算數(shù)運算:可以對指針進行四種算術(shù)運算:++、--、+、-
int var[MAX] = {1, 2, 3};
int *ptr;
ptr = var; // 指針中的數(shù)組地址
ptr++; // 移動到下一個位置
- 指針vs數(shù)組
int var[3] = {1, 2, 3};
for (int i = 0; i < 3; i++) {
*var = i; // 正確語法
// var++; // 錯誤語法
*(var + i) = 10; // 賦值,有效語句
}
- 指針數(shù)組:用來存儲指針的數(shù)組
int main (){
int var[3] = {10, 100, 200};
// **ptr** 為一個數(shù)組,由3個整數(shù)指針組成。因此,ptr 中的每個元素,都是一個指向 int 值的指針
int *ptr[3];
for (int i = 0; i < MAX; i++){
ptr[i] = &var[i]; // 賦值為整數(shù)的地址
}
for (int i = 0; i < MAX; i++){
cout << "Value of var[" << i << "] = ";
cout << *ptr[i] << endl;
}
return 0;
}
- 指向指針的指針:一種多級間接尋址的形式,或者說是一個指針鏈,將指針的地址存放在另一個指針里面
int **var;
- 傳遞指針給函數(shù):引用或地址傳遞參數(shù),使傳遞的參數(shù)在調(diào)用函數(shù)中被改變
- 從函數(shù)返回指針:返回指針到局部變量、靜態(tài)變量和動態(tài)內(nèi)存分配。注意:不支持在函數(shù)外返回局部變量的地址,除非定義局部變量為 static變量
11. 引用
11.1 定義
- 是某個已存在變量的另一個名字
- 一旦把引用初始化為某個變量,就可以使用該引用名稱或變量名稱來指向變量
// r 是一個初始化為 i 的整型引用
int i = 17; int& r = i;
11.2 指針vs引用
- 不存在空引用。引用必須連接到一塊合法的內(nèi)存
- 一旦引用被初始化為一個對象,就不能被指向到另一個對象。指針可以在任何時候指向到另一個對象。
- 引用必須在創(chuàng)建時被初始化。指針可以在任何時間被初始化。
11.3 使用
- 引用作為參數(shù)
void swap(int& x, int& y);
- 引用作為返回值:返回一個對局部變量的引用是不合法的,可以返回一個對靜態(tài)變量的引用
int& func() {
int q;
// return q; // 在編譯時發(fā)生錯誤
static int x;
return x; // 安全,x 在函數(shù)作用域外依然是有效的
}
12. 結(jié)構(gòu)體
struct TypeName {
type1 name1;
type2 name2;
… …
}object_names;
13. 類
13.1 訪問修飾符
- public:成員在程序中類的外部是可訪問的
- private:成員變量或函數(shù)在類的外部是不可訪問的
- protected:與私有成員十分相似,但是成員在派生類(即子類)中是可訪問的
13.2 繼承
- 支持多繼承
13.3 重載
- 重載函數(shù):相同方法名,參數(shù)和實現(xiàn)不同
- 重載運算符:重定義或重載大部分 C++ 內(nèi)置的運算符,operator為關(guān)鍵字
Box operator+(const Box&);
13.4 多態(tài)
- 繼承中,多個子類的不同實現(xiàn)
13.5 虛函數(shù)
- 在基類中使用關(guān)鍵字virtual聲明的函數(shù)
- 在派生類中重新定義基類中定義的虛函數(shù)時,會告訴編譯器不要靜態(tài)鏈接到該函數(shù);在程序中任意點可以根據(jù)所調(diào)用的對象類型來選擇調(diào)用的函數(shù),這種操作被稱為動態(tài)鏈接,或后期綁定
- 純虛函數(shù):在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對象,但是在基類中又不能對虛函數(shù)給出有意義的實現(xiàn)
// = 0 告訴編譯器,函數(shù)沒有主體,是純虛函數(shù)
virtual int area() = 0;
-
接口/抽象類
- 為了給其他類提供一個可以繼承的適當?shù)幕悺3橄箢惒荒鼙挥糜趯嵗瘜ο?,它只能作為接口使?/li>
- 如果試圖實例化一個抽象類的對象,會導致編譯錯誤
- 如果一個 ABC 的子類需要被實例化,則必須實現(xiàn)每個純虛函數(shù)
14. 異常處理
- throw: 當問題出現(xiàn)時,程序會拋出一個異常
- catch: 在您想要處理問題的地方,通過異常處理程序捕獲異常
- try:try 塊中的代碼標識將被激活的特定異常。它后面通常跟著一個或多個 catch 塊
15. 命名空間
- namespace
namespace name { code }
name:: code
namespace name_1 {
namespace name_2 { code }
}
- using
using namespace name;
using name:: code;
using namespace name_1:: name_2
16. 模板
- 函數(shù)模板/泛型
template <typename type> ret-type func-name(parameter list) {
// 函數(shù)的主體
}
template <typename T>
inline T const& Max (T const& a, T const& b) {
return a < b ? b:a;
}
- 類模板
template <class type> class class-name { }
template <class T>
class Stack {
private:
vector<T> elems; // 元素
public:
void push(T const&); // 入棧
void pop(); // 出棧
T top() const; // 返回棧頂元素
bool empty() const{ // 如果為空則返回真。
return elems.empty();
}
};
[注]:C++關(guān)鍵字查閱:https://www.runoob.com/w3cnote/cpp-keyword-intro.html