C++相比于C語言增加了哪些概念?
作者 | 將狼才鯨 |
---|---|
創建日期 | 2025-06-17 |
- CSDN閱讀地址:C++相比于C語言增加了哪些概念?
- Gitee源碼目錄:qemu/demo_代碼示例/02_C++_Class
-
目標受眾:熟悉C語言,對C++完全不了解,但又想熟悉一下C++語言的人;
-
參考網址:
- 【C/C++語言】class的定義和基礎用法
- C++相比于C語言增加的8個小特性(詳解)
-
C++雖然是面向對象的,但是它的第一個函數,main()函數卻是和C語言一樣面向過程的;
-
基礎概念:
- 類 Class:例如聲明一個Class Demo;類似于C語言中的結構體;聲明表示還沒有創建實體,不占內存;
- 私有變量 private:類似于C語言模塊內部static全局變量;
- 公共變量 public:類似于C語言模塊中接口函數;
- 構造函數:Demo (int aa) {a = aa;} 定義類時會自動執行的初始化函數,C語言中沒有此概念;
- Demo(int aa = 100): a(aa) {} 可以直接用默認值初始化;
- 構造函數中: 冒號后面的a(aa) 類似于函數的這種模式其實并不是函數,而只是賦值,類似于aa = a;
- 析構函數,~Demo:同上,在類被delete時自動調用;
- Class聲明中直接實現函數: void geta(int b) {a = b;} 類似于C語言.h頭文件中的inline內聯函數;
- 友元函數 friend:稍微突破模塊化的結構;類似C語言中的全局變量和全局函數;
- 可以簡單的理解為即使定義了多個類,但里面每個類中執行友元函數都是執行的同一個全局接口函數;
- 在類外未定義該類時也能直接調用類里的函數,而該函數不能操作Class里面的局部變量;
- 命名空間 namespace和兩個冒號::的操作符:using namespace std; std::cout 一組類組成的模塊集合,并且里面有些函數是無需定義和初始化就能直接使用的;同時命名空間也可以用來避免命名沖突;
- 域的概念:可以把一個.cpp文件就當成一個域,類似于把一個.c文件當成一個模塊;
- 基類派生類引用轉換(父類和子類):static_cast;類似于C語言中各種結構體入口地址的計算和結構體變量類型強制轉換;
- 數據類型轉換:例如
static_cast<float> a;
其中a變量是double類型;static_cast<float> a
就類似于C語言中的(float)a; - 引用&:可以簡單的將其當成C語言中的指針*,但是它們還有些不一樣,需要在實際使用中慢慢體會;
- func(Demo &d); d.a; 使用引用的元素時,它的元素調用不用->,而使用. 和C語言中有點不一樣;
- 引用在定義時必須同步初始化,類似于C語言中不允許出現野指針,指針必須要賦分配以后的初值;
- 引用初始化后不能再更改對象,而指針可以指向這個指向那個,也可以自增自減等;
- 操作符重載 operator+ =等:例如實現兩個類的加減乘除運算等;
- this->:在類的實現函數中要調用自己類的其它變量時,使用this->;
- 派生:使用:冒號派生成子類,類似于C語言中結構體內嵌套結構體,被嵌套在內部的是父類,外面更大的結構體是子類;
- 與C語言不同的是,子類不光繼承了父類,還可以改寫和重載父類中的函數(C++中稱為方法);
- 繼承:父類的初始化方法或函數在子類中能直接用,這叫繼承;
- 多繼承,一個子類可以包含多個父類;
- 三大類型(封裝、繼承、多態):把一個Class當成一個全私有的結構體,要讀寫變量只能通過調用函數來實現,這就是封裝;
- 父類(基類)中的函數可以被子類(派生類)重寫或重載,這個就叫多態;
- 虛類型 virtual:因為子類中經常會重載父類中的函數,所以干脆父類中把可能會重載的函數加上virtual 來指明,有時甚至自己干脆都不實現了;
- 類的定義 new:可以直接Class AA{}; AA a; 也可以AA *p_a = new AA; 需要有個概念是new一個類時里面的構造函數會自動運行,這和C語言很不一樣;
- 名詞概念:類中的內容稱為類的成員,變量稱為類的屬性或成員變量,類中的函數稱為類的方法或者成員函數;因此,忘掉C語言中的全局變量、私有變量、函數的概念,開始使用屬性和方法;
- protected:和private私有類似;
- 類的實例化:用類創建對象,類似于C語言中的定義(與定義相對應的就是聲明);
- 類空間的釋放 delete:
- auto變量:自動識別數據的類型;
- 增加nullptr空指針關鍵字;
- 異常處理:try、catch、throw
- 泛型編程,模板template:
- template ,有模板函數和模板類;類似于C語言中用宏定義拼接生成多個類似的結構體;
- 模板需要被實例化;
- 標準模板庫(STL):容器vector、list等,迭代器iterator等
- Lambda 表達式:auto func = [](int x) { return x * x; };
- explicit關鍵字:用于修飾單參數構造函數或轉換構造函數,禁止編譯器進行隱式類型轉換,避免意外的行為