C++之static关键字
1、類的靜態成員變量、靜態全局變量
(1)類的靜態成員變量:必須在類外進行顯式的初始化。
初始化格式 <類型><類名>::變量名=初值;
【注】如果不進行初始化類的靜態成員變量,但是在main函數中使用它時,會編譯錯誤。
(2)但是:靜態局部/局部變量:若沒有定義變量時進行初始化,會自動初始化為0.
2、類的靜態/非靜態成員函數相互訪問權限
(1)static成員函數只能訪問static成員函數、static成員變量;不能訪問非static成員函數、非static成員變量。
(2)非static成員函數可以訪問static成員和非static成員。
3、靜態成員受pirvate、protected、public修飾符的限制
受限制的訪問情況和類的非static成員相同。
【注】“靜態成員受pirvate、protected、public修飾符的限制”這一特性,也是static變量和全局變量的區別之一:static變量在類中能實現信息隱藏,但是全局變量不能。
4、靜態成員函數的類內定義、類外聲明格式問題
【注】在類外定義是不用再加static關鍵字。
5、兩種訪問格式:
(1)<類名>::
(2)<類對象>.
6、static成員可以被繼承(但是受訪問符的限制),且子類和父類的static變量是共用的
7、static成員變量、const static成員常量的區別
【初始化問題】
const static成員常量
A.可以在類內部聲明的時候進行初始化;如const static int aa=100;
B.可以在類外進行初始化(類似于static成員變量)
初始化格式:const <類型><類名>::變量名=初值;
如:const int A::aa = 321;
static成員變量:只可以在類外進行初始化。
【注】二者都不能用成員初始化列表進行初始化。
【引出知識點】哪三種情況只能用成員初始化列表,不能用賦值操作進行初始化:
①成員變量是:引用
②成員變量是:const (非const static成員變量)
③類的構造函數需要調用其父類的構造函數的時候
【知識拓展】
(1)哪些函數不能被繼承?
構造、拷貝構造、析構、賦值運算符、友元函數
(2)那些成員能被繼承?
類的普通成員、static成員、重載的賦值操作符
(3)那些函數不能聲明為虛函數?(并分析原因)
【判斷依據,能聲明虛函數必須滿足】子類重寫了父類中的虛函數,在運行時的動態綁定完成覆蓋。
非類的成員函數:不屬于類當然不能聲明為虛函數。
static成員函數:屬于類共有,沒有某個對象的動態綁定。
inline成員函數:編譯時進行代碼嵌入,而虛函數是在運行時。
構造函數:
友元函數:
1、為什么C++不支持普通函數為虛函數?
普通函數(非成員函數)只能被overload,不能被override,聲明為虛函數也沒有什么意思,因此編譯器會在編譯時邦定函數。
2、為什么C++不支持構造函數為虛函數?
這個原因很簡單,主要是從語義上考慮,所以不支持。因為構造函數本來就是為了明確初始化對象成員才產生的,然而virtual
function主要是為了再不完全了解細節的情況下也能正確處理對象。另外,virtual函數是在不同類型的對象產生不同的動作,現在對象還沒有產生,如何使用virtual函數來完成你想完成的動作。(這不就是典型的悖論)
構造函數一般是用來初始化對象,只有在一個對象生成之后,才能發揮多態的作用,如果將構造函數聲明為virtual函數,則表現為在對象還沒有生成的情況下就使用了多態機制,因而是行不通的
3、為什么C++不支持內聯成員函數為虛函數?
其實很簡單,那內聯函數就是為了在代碼中直接展開,減少函數調用花費的代價,虛函數是為了在繼承后對象能夠準確的執行自己的動作,這是不可能統一的。(再說了,inline函數在編譯時被展開,虛函數在運行時才能動態的邦定函數)
(inline函數和virtual函數有著本質的區別,inline函數是在程序被編譯時就展開,在函數調用處用整個函數體去替換,而virtual函數是在運行期才能夠確定如何去調用的,因而inline函數體現的是一種編譯期機制,virtual函數體現的是一種運行期機制。此外,一切virtual函數都不可能是inline函數。)
4、為什么C++不支持靜態成員函數為虛函數?
這也很簡單,靜態成員函數對于每個類來說只有一份代碼,所有的對象都共享這一份代碼,他也沒有要動態邦定的必要性。不能被繼承,只屬于該類。
5、為什么C++不支持友元函數為虛函數? 因為C++不支持友元函數的繼承,對于沒有繼承特性的函數沒有虛函數的說法。(友元函數不屬于類的成員函數,不能被繼承。)
2017/03/02
總結
以上是生活随笔為你收集整理的C++之static关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vm ububtu突然没网
- 下一篇: C++之临时对象的构造与析构