從畢業到從事工作,才發現自己基礎到底有多爛,領導問起來一問三不知,場面十分尷尬,愧於說自己學過C++。現在對一些C++中一直模糊的概念做一總結。在接下來的一段時間裏也將重新學習C++。
1. 靜態成員函數
靜態成員函數是類裏面定義的標註了static的成員函數。它與任何對象無關,不具有this指針,所以也就無法直接訪問類對象的非靜態成員變量和非靜態成員函數。使用非靜態成員函數:
- 爲了處理靜態成員變量
- 不能默認訪問非靜態數據成員和非靜態成員函數,但可以通過對象名間接訪問
A::func(int x){cout<<a.x<<endl;} //func靜態成員函數,a是類的對象,x爲非靜態數據成員
靜態成員函數 | 普通成員函數 | |
---|---|---|
所有對象共享 | √ | √ |
隱含this 指針 | × | √ |
訪問普通成員變量/函數 | × | √ |
訪問靜態成員變量 /函數 | √ | √ |
通過類名直接調用 | √ | × |
通過對象名直接調用 | √ | √ |
2. 純虛函數
virtual 類型 函數名(參數列表)=0;//純虛函數
- 包含純虛函數的類是抽象類。
- 抽象類不能實例化對象,純虛函數在派生類中重新定義之後,派生類才能實例化出對象。
- 純虛函數與普通的虛函數的區別是純虛函數必須在派生類中被實現,而虛函數允許不被實現。定義純虛函數可以防止在編寫大型項目過程中遺漏某個重要的函數實現,如果純虛函數沒有被實現,則在編譯的過程中會報錯。
3. 虛函數
允許在派生類中重新定義與基類同名的函數,並且可以通過基類指針或者引用來訪問基類和派生類中的同名函數。
4. 重載、重寫、重定義
先上一張表格:
重載 | 重寫 | 重定義 | |
---|---|---|---|
範圍 | 同一個類中 | 基類和派生類 | 基類和派生類 |
函數名 | 相同 | 相同 | 相同 |
參數 | 不同 | 相同 | 均可 |
有無virtual | 無 | 有 | 均可 |
重載:在同一個類中的內部存在,函數名要求相同,函數之間通過返回值類型和參數列表個數及參數列表類型來區分。
重載相關閱讀
重寫:也稱爲覆蓋。在派生類中重新定義的一個和基類中有相同名稱和參數的虛函數。函數必須是虛函數virtual,不能是靜態static函數;必須有相同類型、名稱和參數列表;訪問修飾符可以不同。
重定義:也稱爲隱藏。當派生類函數與基類函數同名,如果參數不同,則無論有無virtual,基類函數都被隱藏;當派生類函數與基類函數同名,參數也相同時,如果有virtual則是重寫,沒有virtual時,基類函數被隱藏。
5. 結構體、類
本質區別:struct默認訪問權限是public;class默認的訪問權限是private。
class還用於定義模板參數,而struct不用於定義模板參數。
6. 聯合
- 如果聯合中的函數被實現了,則生成編譯代碼,否則不編譯,爲了節省內存的一種手段;
- 對於變量,長度選取最大的字節長度,讀取類型必須是最近一次存入的類型;
- 可用於數據轉換。