【C++】静态成员 static
靜態成員
- 靜態成員 static
- static應用
- 單例模式
- new\delete誤區
靜態成員 static
靜態成員:被static修飾的成員變量/函數,只占一份內存
- 存儲在數據段(全局區,類似于全局變量)
-
可以通過
-
對象訪問(對象.靜態成員)
-
對象指針訪問(對象指針->靜態成員)
-
類訪問(類名::靜態成員)
Car::m_price = 400
-
-
必須初始化,必須放在類外面初始化再使用,在外面不能再寫static了
不能使用int m_price = 0;,這樣只是初始化了一個同名的變量。 -
就算在main里沒有創建Car對象,直接打印Car::m_price也可以,不依賴類存在,因為是全局變量
-
對比全局變量,它可以設定訪問權限(public、protected、private),達到局部共享的目的
-
如果類的聲明和實現分離,比如類的聲明在.h文件,具體實現在.cpp文件,需要在.cpp中初始化。
靜態成員函數
被static修飾的成員函數
只要是靜態成員,都有三種訪問方式(對象、指針、類)
-
內部不能使用this指針
也不能訪問內部成員變量(相當于使用this)
this指針只能用在非靜態成員函數內部
-
靜態成員函數不能是虛函數
虛函數只能是非靜態成員函數
-
靜態成員內部不能訪問非靜態成員變量\函數,只能訪問靜態成員變量\函數
-
非靜態成員函數內部可以訪問靜態函數變量\函數
-
構造函數、析構函數不能是靜態
因為構造函數和析構函數是針對對象的,靜態成員并不在對象內
-
當聲明和實現分離時,實現部分不能帶static
static應用
單例模式
設計模式的一種,保證某個類永遠只創建一個對象
無論調用多少次shareRocket,返回的地址都是一樣的。
-
完善
int main() { Rocket *p1 = Rocket::sharedRocket();Rocket *p2 = Rocket::sharedRocket();return 0; } // p1和p2的地址是一樣的-
不允許有賦值操作,比如p1 = p2,這樣是沒有意義的,應該被禁止。
所以就使用運算符重載來禁止。
直接將賦值運算符私有化,這樣賦值就會被禁止。
-
其次拷貝構造函數也應該被私有化
-
new\delete誤區
int *p = new int; // 從堆空間分配四個字節給p *p = 10; delete p; // 回收堆空間并不是說把p的四個字節清空
回收堆空間內存:這塊堆空間內存可以重新被別人使用。然后再new int,可能被分配到的字節是之前被用過的字節
如果銷毀同時清零會浪費效率。
所以如果需要清零就手動清零
總結
以上是生活随笔為你收集整理的【C++】静态成员 static的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++】多继承
- 下一篇: 【C++】智能指针 Smart Poin