C++理論概念知識
- 0、C++ 概念
- 1、C / C++的差異性
-
- 1.1、c++ 有更嚴格的類型檢查
- 1.2、const 修飾一個變量
- 1.3、c++ 強制類型轉換: int(a); int(a+b)
- 1.4、變量引用,為已存在的變量取别名
- 1.5、函數重載,對一個函數賦予新的含義
- 1.6、c++ 可以帶預設參數
- 1.7、内聯函數,隻在聲明時使用inline說明
- 1.8、結構體
- 2、記憶體模型及名字空間
-
- 2.1、作用域
- 2.2、連接配接性,描述名稱如何在各個單元中共享
- 2.3、動态記憶體
- 2.4、聲明區,潛在的作用域
- 3、輸入輸出流
-
- 3.1、輸出流
- 3.1、輸入流
- 4、類和對象
-
- 4.1、類體中預設權限為:private 私有的
- 4.2、成員函數在類體之外的定義文法
- 4.3、成員變量的作用域
- 4.4、 this 指針
- 4.5、類
- 4.6、對象
- 4.7、OOP思想:面向對象程式設計的思想
- 4.8、如果設計一個類時,沒有顯示聲明會自動生成
- 4.9、構造
- 4.10、拷貝構造
- 4.11、析構函數
- 4.12、this指針
- 4.13、static 修飾成員
- 4.14、const 修飾成員
- 4.15、友元
- 5、運算符重載
-
- 5.1、成員運算符重載函數
- 5.2、友元運算符重載函數
- 5.3、函數資料類型
- 6、模闆
-
- 6.1、什麼是模闆
- 6.2、類型模闆參數
- 6.3、非類型模闆參數
- 6.4、預設模闆參數
- 6.5、友元函數模闆
- 7、類繼承
-
- 7.1、概念
- 7.2、派生一個類
- 7.3、派生類的構造和析構
- 7.4、is-a關系
- 7.5、多重繼承
- 8、多态
-
- 9.1、什麼是多态
- 9.2、虛函數
- 9.3、覆寫、重載及隐藏
- 9.4、動态聯編
- 9.5、抽象類
- 9.6、虛繼承
- 9.7、虛析構函數
- 9.8、限制構造函數
- 9、異常
-
- 9.1、什麼是異常
- 9.2、使用标準異常
- 9.3、自定義異常
- 9.4、異正常範
- 10、轉換函數
-
- 10.1、什麼是轉換函數
- 10.2、标準轉換函數
- 10.3、自定義轉換函數
- 10.4、慎用轉換函數
- 11、智能指針
-
- 11.1、什麼是智能指針
- 12.2、shared-ptr
- 11.3、unique ptr
- 11.4、weak-ptr
- 十二、STL
-
- 12.1、STL簡介
- 12.2、标準容器簡介
- 12.3、vector
- 12.4、list
- 12.5、deque
- C++進階開發推薦資料手冊!
- 跳轉:C++ 程式設計!
- 跳轉:下一篇、QT GUI程式設計!
統一聲明:
部落格轉載 聲 明 : 本部落格部分内容來源于網絡、書籍、及各類手冊。
内容宗旨為友善查詢、總結備份、開源分享。
部分轉載内容均有注明出處,如有侵權請聯系部落格告知并删除,謝謝!
百度雲盤提取碼:統一提取碼:
ziyu
0、C++ 概念
c ++ 編譯是用 g++ 擴充名是cpp
1、C / C++的差異性
c++是面向對象的語言,C語言是面向過程的語言
1.1、c++ 有更嚴格的類型檢查
1.2、const 修飾一個變量
表示變量永遠隻讀、可以使用,但不能修;
C語言可以通過const指針修改。
1.3、c++ 強制類型轉換: int(a); int(a+b)
1.4、變量引用,為已存在的變量取别名
注意:
1、取别名時需要指派,但不能為常量指派
2、函數傳參也可以使用
3、函數被調用時、才會用性參取别名
補充:
引用必須初始化
引用在初始化後,不可以改變
不能傳回局部變量的引用
如果函數做左值,那麼必須傳回引用
引用的本質在c++内部實作是一個指針常量
1.5、函數重載,對一個函數賦予新的含義
注意:
1、函數名可以相同,參數清單必須不同
2、參數個數不相同
3、參數個數可以相同,但類型必須不同
1.6、c++ 可以帶預設參數
1、隻能在函數聲明時設定預設參數,定義時不能設定
2、預設參數隻能從右到左指派,中間不能跳躍
注意:
1、預設參數結合函數重載,調用時容易産生歧義
2、對引用類型形參指派時,必須使用已存在的全局變量
3、使用的時候看實參來調用,函數的傳回值不可以作為函數重載的條件
1.7、内聯函數,隻在聲明時使用inline說明
注意:
1、頻繁使用的函數
2、代碼語句少于等于5局
3、代碼語句簡單,沒有控制語句
目的:
1、優點:提升代碼運作效率;缺點:目标程式體積較大
1.8、結構體
1、c++ 中為了保護資料的安全性,引入了通路權限限定符。
2、結構體變量初始化、引入了構造函數
3、釋放結構體變量占用資源、引入了構造函數
2、記憶體模型及名字空間
2.1、作用域
描述了一個名字在檔案(編譯單元)的多大範圍可見。
1、c++ 支援三種形式的域
1、局部域
包含在函數定義或者函數塊中長線文本部分
2、名字空間域
不包含函數聲明或者類定義内的程式文本部分
3、類域
每個類定義都引入了一個獨立的類域
2、變量的作用域
1、局部變量
2、全局變量
3、自動變量
4、名字空間作用域
5、類作用域
2.2、連接配接性,描述名稱如何在各個單元中共享
1、外部連結
名稱可以在檔案間共享
2、内部連結
名稱隻能在一個檔案中函數共享
2.3、動态記憶體
1、new
在堆區開辟一個空間
2、delete
釋放開辟的堆空間
2.4、聲明區,潛在的作用域
1、聲明區,可以進行聲明的區域
namespace MySpace{ //給這片聲明區取名字 MySpace
}
2、名字空間
::
3、潛在的作用域
從聲明點、到聲明區結尾
3、輸入輸出流
3.1、輸出流
輸出流 cout << 表達式1 << 表達式2 << ...;
換行:
控制符:endl
換行符:\n
3.1、輸入流
輸入流 cin >> 變量1 >> 變量2 >> ...;
4、類和對象
4.1、類體中預設權限為:private 私有的
4.2、成員函數在類體之外的定義文法
資料類型 類名::函數名(<參數清單>){函數體}
4.3、成員變量的作用域
整個類的作用域(類域):類的所有成員函數在函數體區域
4.4、 this 指針
類的所有成員函數都有一個特殊的指針 this, 指向 通路目前成員函數的對象
4.5、類
代碼角度:使用者自定義的資料類型,由class 進行說明
抽象角度:對象的類型,是一批對象的共享和特征,是對象的抽象概括
4.6、對象
代碼角度:就是一個變量
抽象角度:具備行為和屬性的事物,一切皆為對象,也就是類的具體實列
4.7、OOP思想:面向對象程式設計的思想
1、抽象:就是聲明定義一個類,抽象概括一類對象的公共性質。
資料抽象:設定成員變量
代碼抽象:設定成員函數
2、封裝:将資料成員和成員函數結合在一起,形成一個整體,就是類體部分。
4.8、如果設計一個類時,沒有顯示聲明會自動生成
- 構造函數
- 析構函數
- 複制構造函數
- 指派運算符
- 位址運算符
4.9、構造
構造函數的目的: 用來初始化對象
特點:
1、預設構造函數沒有顯式說明時,會自動生成
2、構造函數沒有資料類型,也就是沒有傳回值
3、構造函數函數函數名 與 類名一緻
4、構造函數隻能在定義對象時,被系統自動調用
5、構造函數可以重載
6、構造函數可以有預設參數
7、構造函數是類的 特殊成員函數
8、構造函數一般聲明在 public 區域,也可以聲明在 protected和private 區域形成限制構造
4.10、拷貝構造
1、淺拷貝:
同類型的兩個對象的成員指針,指向同一個堆區空間,兩成員指針互相幹擾
2、深拷貝:
同類型的兩個對象的成員指針,指向兩個不同的堆區,互不幹擾
4.11、析構函數
1、析構函數:作用用來回收對象占用的資源
特點:
1、沒有資料類型,也就是沒有傳回值
2、函數名由 ~類名 構成
3、析構沒有參數和傳回值,是以不能被重載。
4、對象生命周期結束時,系統自動調用
5、對象指針遇見 delete 時,系統自動調用
2、包含對象成員(另一個類的對象最為改類的成員變量)的類對象的構造順序;
構造順序:
先對象成員構造,再對象構造
析構順序:
先對象析構,再對象成員析構
4.12、this指針
this指針是一個特殊指針,指向類對象自身的首位址。
4.13、static 修飾成員
1、靜态成員變量
1、在整個類域都可見,與具體的對象無關,
static 改變了生命周期,可以作用類型的不同對象之間的資料傳遞。
2、必須在類體之外定義初始化。
2、靜态成員函數:
1、聲明時必須有 staic 關鍵字,定義時不能有 static。
2、函數體中不能通路類的非靜态成員。因為這裡面沒有this指針,也是文法規定的。
3、靜态修飾對象:就是修飾一個變量,改變聲明周期。
4.14、const 修飾成員
1、const 修飾成員變量,表示隻讀,必須在構造函數 參數初始化清單中賦初值
1、參數初始化清單文法:
類名(<形參清單>):成員變量(形參1),成員變量(形參2)...
{}
說明:
1、程式在執行時,調用構造函數先執行參數初始化清單,然後才執行 構造函數體
2、包含const 成員變量的類的所有構造函數都必須寫出參數初始化清單,為隻讀變量賦初值。
2、const 修飾成員函數
1、聲明定義都必須使用 const 關鍵字
2、表示不能使用該函數修改任何的成員變量,但是可以通路成員變量
3、const 修飾成員對象:
1、表示該對象定義初始化之後,任何屬性都不能更改
2、const 修飾的對象不能通路類的非const 成員函數
4.15、友元
友元可以破壞類的隐藏與封裝,慎用。
1、友元函數
1、一個友元函數可以是多個類的有元函數,隻需要在各個類中分别聲明。
2、友元函數: 就是在成員函數聲明之前使用 friend 關鍵字說明,此時該函數就打破類的封裝:
1、友元函數不再是類的成員函數,不能通過對象 . 号通路,隻能像普通函數調用一樣使用
2、友元函數的函數體中,沒有類體的通路權限限定,也就是可以直接通過 對象.号 通路非靜态成員,可以通過 類名::靜态成員
3、友元函數如果沒有類類型作為形參,那麼必須在類的外部進行定義,否則聲明定義都可以在類體中
4、友元函數必須聲明在類體中
2、友元類
1、友元關系不能被繼承
2、友元關系是單向的,不具有互動性。
3、如果 B 是 A 的友元類,也就是 A 将 B 當成朋友:
那麼在 B 類的所有成員函數中将 打破 A 類的權限。
3、有元成員函數
1、B類的成元函數可以是類A的友元。
5、運算符重載
運算符重載:對已有的運算符重新進行定義,賦予其另一種功能,以适應不同的資料類型
不能被重載的運算符
逗号"." ?号表達式"?:" sizeof 作用域"::"
5.1、成員運算符重載函數
函數體中有this指針指向第一個操作數,重載函數的形參個數 = 操作數 - 1;除了b++或b--
5.2、友元運算符重載函數
函數體中沒有this指針指向第一個操作數,重載函數的形參個數 = 操作數;除了b++或b--
重載函數的第一個形參,表示第一個操作數
5.3、函數資料類型
1、一般情況下,由傳回值決定。
2、傳回類的成員變量,并且期望傳回之後能改變成員變量的數值,則傳回引用類型。
6、模闆
6.1、什麼是模闆
模闆:支援參數多态化都工具,讓函數或者;類具備通用性。
目的:讓程式員編寫與類型無關的代碼,是泛型程式設計的基礎
分類:
1、函數模闆
僅針對函數參數類型,傳回值不同,功能相同的函數
template < class形參名, class形參名> 傳回類型 函數名(參數清單)
{
函數體
}
2、類模闆
類模闆針對僅資料成員和成員函數類型不同的
template < class形參名, class形參名,...> class 類名
{
......
}
template <class T, typename B ...>
template: 關鍵字,說明是一個模闆
class T : 定義類型模闆形參,class 等價于 typename
T : 類型模闆形參,用來替換資料類型
注意:
模闆聲明和全局隻能在全局。
6.2、類型模闆參數
成員函數在類模闆 類體外定義的基本文法,必須單獨使用 template 說明
注意: 作用域通路符前 必須是 類名<類型形參>::
6.3、非類型模闆參數
使用非類型模闆形參,目的:讓模闆中的常數具備靈活性。
template <class T, int var> class Demo
{
......
}
6.4、預設模闆參數
template <class Tl, class t2=int> class Demo
{
......
}
6.5、友元函數模闆
友元函數聲明時定義時都需要加模闆 template <class B>
7、類繼承
7.1、概念
在進行C程式設計的時候,代碼重用的目的就是提高開發效率、減少錯誤、讓大規模代碼開發的關注點轉到軟體結構上。
C++(OOP)的代碼重用除了簡單層次的提供類庫,還提出了更高層次:
類繼承( inheritance)、多态( Polymorphism)、泛型程式設計( Generic Programming),等等
基類:在面向對象設計中,被定義為包含所有實體共性的class類型,被稱為“基類”。
繼承:就是在一個已存在的類的基礎上建立一個新的類。
派生:從已有的類産生一個字類
最遠派生類:在派生體系中派生到最下層的類
派生類繼承了基類的所有資料成員和成員函數 ***
//派生一個子類,子類繼承父類的所有資料成員和成員函數
/*
公有繼承:繼承過來的成員的 權限不變
*/
子類和基類有相同的成員,要通路基類 同名成員時,必須使用 基類名::成員名
7.2、派生一個類
//預設向上隐式轉換,也就是将派生類對象指派給基類對象時,将派生類類型轉換成基類類型,派生類将會丢棄自身的資料部分
//也稱為小範圍指派給大範
//向下轉換是不被允許的,不允許将大範圍指派給小範圍
7.3、派生類的構造和析構
派生類不能繼承基類的構造、析構函數
派生類有自己的構造、析構函數
如果基類構造函數有參數,在從派生類的構造函數把參數傳遞給基類的構造函數
派生類名∷:構造函數名(參數清單):基類名(參數清單)
1、繼承時,構造順序:先基類構造,再派生構造
析構順序:先派生類析構,再基類構造
2、包含對象成員的派生類和基類構造順序:
先 基類構造,再對象成員構造,最後派生類構造
3、析構順序與構造順序相反
注意:類體中顯示說明,帶參數的構造函數,那麼無參數的預設構造 不會自動生成
1、派生類構造函數參數初始化清單中,隐式調用基類 預設構造(無參數的構造函數)
2、如果基類出現帶參數構造函數,必須在派生類的構造函數參數初始化清單中,顯示調用 基類帶參構造函數
3、如果派生對象成員的構造函數帶參數,必須在派生類的構造函數參數初始化清單中,為對象成員這個變量賦初值。
7.4、is-a關系
is-a 一般是繼承關系,has-a一般是組合。
is-a 派生類對象也是一個基類對象,基類對象能夠做的操作,派生類也可以
has-a 是一種聚合,表示一個類中有另一個類的對象。
7.5、多重繼承
多重繼承的路徑二義性:解決方式,作用域通路符 和 設定虛基類(虛繼承(繼承時有 virtual)共同的基類叫虛基類)
8、多态
9.1、什麼是多态
9.1.1、什麼是多态
簡單概括:"一個接口,多種方法";
也就是程式在運作時才決定調用的函數,是面向對象程式設計領域的核心概念。
9.1.2、什麼是多态性:
多态性是将接口與實作進行分離;也就是實作以共同的方法,但因個體差異,而采用不同的政策。
9.1.3、面向對象程式設計(OPP)主要特征:
- 封裝:實作實細節隐藏,使代碼子產品化。
- 繼承:擴充已經存在的代碼,目的是為了代碼重用。
- 多态:目的是為了接口重用。
9.2、虛函數
9.2.1、多态性的實作:虛函數 (virtual function)
簡單地說,用 virtual修飾的成員函數,就是虛函數
A、必須是類的成員函數
B、類的靜态成員函數不能成員虛函數
C、構造函數不能定義為虛函數,但是析構函數可以定義為虛函數
D、成員函數使用 virtual 關鍵字,定義時不需要
E、基類有虛函數,那麼派生類中的同名函數(函數名相同,參數清單一緻,傳回值相同)自動成員析構函數
9.3、覆寫、重載及隐藏
9.3.1、成員函數覆寫( override,也稱重寫)
是指派生類重新定義基類的虛函數,特征如下:
A、不同的作用域(分别位于派生類與基類)
B、函數名字相同
C、參數相同
D、基類函數必須有 virtual關鍵字,不能有 static
E、傳回值相同
F、重寫函數的權限通路限定符可以不同
9.3.2、成員函數重載( overload)
是指函數名相同,參數不同(數量、類型、次序),特征如下:
A、相同的範圍(在同一個作用域中)
B、函數名字相同
C、參數不同
D、 virtual關鍵字可有可無
E、傳回值可以不同
9.3.3、成員函數隐藏(也稱重定義)
A、不在同一個作用域(分别位于派生類與基類)
B、函數名字相同
C、傳回值可以不同
D、參數不同。此時,不論有無 virtual關鍵字,基類的函數将被隐藏(注意與重載的差別)
E、參數相同,但是基類函數沒有 virtual關鍵字。此時,基類的函數被隐藏(注意與覆寫的差別
9.4、動态聯編
9.4.1、聯編(連結)
就是将子產品或者函數起生成可執行代碼的處理過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法:靜态聯編
9.4.2、靜态聯編(靜态連結)
是指在編譯階段就将函數實作和函數調用關聯起來,是以靜态聯編也叫早綁定,
9.4.3、動态聯編(動态連結)
是指在程式執行的時候才将函數實作和函數調用關聯,是以也叫運作時綁定或者晚綁定。C+中一般情況下聯編也是靜态聯編,但是
及到多态和虛拟函數就必須要使用動态聯編了
9.4.4、重載隻是一種語言特性
編譯器根據函數不同的參數表,把同分開來,屬于靜态聯編,與多态無關。引用一句 Bruce Ecke的話要犯傻,如果它不是晚綁就不是多态。
9.5、抽象類
9.5.1、抽象基類:
含有純虛函數的類就是抽象類。
抽象類沒有完整的資訊,隻能是派生類的基類
抽象類不能有執行個體,不能有靜态成員
派生類應該實作抽象類的所有方法
9.6、虛繼承
9.6.1、虛析構函數:
C++使用虛拟繼承( Virtual Inheritance),解決從不同途徑繼承來的同名的資料成員在記憶體中有不同的
拷貝造成資料不一緻問題,将共同基類設定為虛基類。這時從不同的路徑繼承過來的同名資料成員在記憶體中就隻有一個拷貝,同一個函數名也隻有一個映射。
由于指針指向的對象是基類類型,是以 delete銷毀對象的時候,并不會調用派生類的析構函數,
這樣就造成員對象消耗不完整
如果基類并不需要回收清理什麼,那麼析構函數就可以是純虛函數。
9.7、虛析構函數
虛析構函數:解決資源回收不完整問題(基類指針指向堆區的派生類對象的首位址,釋放基類指針)
如果基類并不需要回收清理什麼,那麼析構函數就可以是純虛函數。
9.8、限制構造函數
一個類的構造函數通路權限不是 public,該類的構造函數就是限制構成函數
9、異常
9.1、什麼是異常
- 什麼是異常:異常在一種容錯機制,是一種錯誤處理系統。
- 為什麼要有異常:保證軟體系統運作的穩定性與健狀性
- C++的異常處理機制有3部分組成try(檢查)→ throw(抛出)> catch(捕獲)
try{
//檢查語句
if(錯誤){
throw異常
}
}
catch(異常類型1){
進行異常處理的語句1
}
...
- C++ 中預設每一個函數都會抛出異常,但是不會指定抛出異常類型,
- 是以函數設計者應該在函數聲明定義時需要顯示說明抛出的異常類型。throw(...)
9.2、使用标準異常
- C++ 中預設每一個函數都會抛出異常,如果要說明該函數不會抛出異常,那麼聲明和定義時,都用 throw()
- 如果函數說明為 不會抛出異常,那麼内部強行抛出異常,會出現終止程式運作
- throw() :是C++ 舊标準的
- noexcept:是C++ 11 标準中的運算符,32位機中編譯時,必須使用 -std=c++0x
- int func(int, int)throw();
9.3、自定義異常
- 在設計一個大系統的時候,往往設計者會自定義很多錯誤,這些錯誤在标準錯 誤裡面是沒有的,那麼就需要我們來設計一些異常類
9.4、異正常範
10、轉換函數
10.1、什麼是轉換函數
**11.1.1、C++中,自定義的類型轉換成 其他任何一種類型,都采用轉換函數,轉換函數應該聲明在 要轉換的類體中**
轉換函數的實質:
運算符重載,隻是重載的不是内置運算符,而是類名或者基本資料類型
**11.1.2、轉換函數文法:**
operator 類型名()
{
實作轉換的語句
}
**11.1.3、轉換函數的特點:**
(1)轉換函數隻能是成員函數,無傳回值,空參數,有return傳回值。
(2)不能轉換成 void 數組 函數類型
(3)常定義為 const 形式
10.2、标準轉換函數
10.3、自定義轉換函數
10.4、慎用轉換函數
11、智能指針
11.1、什麼是智能指針
12.2、shared-ptr
11.3、unique ptr
11.4、weak-ptr
十二、STL
12.1、STL簡介
STL的目的是标準化元件,這樣就不用重新,可以使用現成。
- 容器( containers )
特殊的資料結構,實作了數組、連結清單、隊列、等等,實質是模闆類
- 疊代器( iterators )
一種複雜的指針,可以通過其讀寫容器中的對象,實質是運算符重載
- 算法( algorithms )
讀寫容器對象的邏輯算法:排序、周遊、查找、等等,實質是模闆函數
- 空間配置器( allocator)
容器的空間配置管理的模闆類
- 配接器( adapters )
用來修飾容器、仿函數、疊代器接口
- 仿函數( functors )
類似函數,通過重載()運算符來模拟函數行為的類
12.2、标準容器簡介
STL标準模版庫是一種泛型程式設計。
參考連結 ->
STL常用接口大全:
STL容器接口一覽:
12.3、vector
12.4、list
12.5、deque
C++進階開發推薦資料手冊!
C++進階開發推薦資料手冊!
連結:https://pan.baidu.com/s/1-U_rettuHeSs1pUqaMbRwg
提取碼:xxkt
跳轉:C++ 程式設計!
跳轉:C++程式設計!
跳轉:下一篇、QT GUI程式設計!
跳轉:下一篇、QT GUI程式設計!
跳轉:開頭