c++ static詳細使用分析
一.定義
在C++中,
static是一個關(guān)鍵字,用于聲明靜態(tài)成員、靜態(tài)局部變量以及靜態(tài)函數(shù)。
二.各種類型分析
1.靜態(tài)成員變量:
- 靜態(tài)成員變量是類的屬性,它在所有類實例之間共享,只有一個副本。
- 靜態(tài)成員變量在類內(nèi)聲明,在類外定義和初始化。
class MyClass {
public:
static int count; // 靜態(tài)成員變量聲明
};
int MyClass::count = 0; // 靜態(tài)成員變量定義和初始化
int main() {
MyClass obj1;
MyClass obj2;
obj1.count = 2;
cout << obj2.count; // 輸出為2,因為count是靜態(tài)成員變量,被所有類實例共享
return 0;
}2.靜態(tài)局部變量:
- 靜態(tài)局部變量在函數(shù)內(nèi)部聲明,并在程序的整個生命周期內(nèi)保持其值,而不是在每次函數(shù)調(diào)用時重新初始化。
- 靜態(tài)局部變量只在函數(shù)第一次被調(diào)用時初始化,之后保持其值。
void myFunction() {
static int count = 0; // 靜態(tài)局部變量
count++;
cout << count << endl;
}
int main() {
myFunction(); // 輸出1
myFunction(); // 輸出2
myFunction(); // 輸出3
return 0;
}3.靜態(tài)函數(shù):
- 靜態(tài)函數(shù)是屬于類的函數(shù),不依賴于類的實例,可以直接通過類名調(diào)用。
- 靜態(tài)函數(shù)不能訪問非靜態(tài)成員變量,只能訪問靜態(tài)成員變量。
class MyClass {
public:
static void myStaticFunction() {
cout << "This is a static function." << endl;
}
};
int main() {
MyClass::myStaticFunction(); // 直接通過類名調(diào)用靜態(tài)函數(shù)
return 0;
}三.實際開發(fā)中static的用法
1.單例模式(Singleton Pattern):
使用靜態(tài)成員函數(shù)和靜態(tài)成員變量創(chuàng)建單例類,確保只有一個實例存在。
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
void doSomething() {
// ...
}
private:
Singleton() {} // 私有構(gòu)造函數(shù),防止外部創(chuàng)建實例
};
int main() {
Singleton& obj = Singleton::getInstance();
obj.doSomething();
return 0;
}2.計數(shù)器變量:
使用靜態(tài)成員變量實現(xiàn)計數(shù)器功能,用于統(tǒng)計類的實例數(shù)量。
class Counter {
public:
Counter() {
count++;
}
~Counter() {
count--;
}
static int getCount() {
return count;
}
private:
static int count; // 靜態(tài)成員變量
};
int Counter::count = 0; // 靜態(tài)成員變量初始化
int main() {
Counter obj1;
Counter obj2;
cout << Counter::getCount() << endl; // 輸出2
return 0;
}3.輔助函數(shù):
使用靜態(tài)函數(shù)作為輔助函數(shù),不依賴于類的實例,可以直接調(diào)用。
class MathUtils {
public:
static int add(int a, int b) {
return a + b;
}
};
int main() {
int sum = MathUtils::add(5, 3); // 調(diào)用靜態(tài)函數(shù)
cout << sum << endl; // 輸出8
return 0;
}4.緩存數(shù)據(jù):
使用靜態(tài)局部變量作為緩存,避免重復(fù)計算或頻繁的資源獲取操作。
int getData() {
static int cache = fetchData(); // 靜態(tài)局部變量作為緩存
return cache;
}
int main() {
int data = getData(); // 第一次調(diào)用需要獲取數(shù)據(jù)
data = getData(); // 后續(xù)調(diào)用直接使用緩存數(shù)據(jù)
return 0;
}四.static內(nèi)存分配
在C++中,靜態(tài)成員變量和靜態(tài)局部變量的內(nèi)存分配時機是不同的。
1.靜態(tài)成員變量的內(nèi)存分配:
- 靜態(tài)成員變量在程序啟動時進行內(nèi)存分配,無論是否創(chuàng)建類的實例。
- 內(nèi)存分配發(fā)生在程序的靜態(tài)數(shù)據(jù)區(qū)(static data segment)。
- 靜態(tài)成員變量的初始化在其首次使用之前進行,通常在程序啟動時進行。
2.靜態(tài)局部變量的內(nèi)存分配:
- 靜態(tài)局部變量在其所在的函數(shù)第一次被調(diào)用時進行內(nèi)存分配。
- 內(nèi)存分配發(fā)生在程序的靜態(tài)數(shù)據(jù)區(qū)。
- 靜態(tài)局部變量只在首次調(diào)用時進行初始化,之后保持其值。
需要注意的是,靜態(tài)局部變量和靜態(tài)成員變量的內(nèi)存分配和初始化時機是在編譯時確定的,與程序的執(zhí)行流程無關(guān)。靜態(tài)局部變量和靜態(tài)成員變量的生命周期和作用域與其所在的函數(shù)或類相關(guān)。
另外,靜態(tài)局部變量和靜態(tài)成員變量的作用域是在定義它們的函數(shù)或類范圍內(nèi)可見。靜態(tài)局部變量的作用域是局部的,只在定義它們的函數(shù)內(nèi)可見。而靜態(tài)成員變量的作用域是類級別的,可以通過類名訪問。
總結(jié)起來,靜態(tài)成員變量在程序啟動時進行內(nèi)存分配和初始化,而靜態(tài)局部變量在其所在函數(shù)第一次被調(diào)用時進行內(nèi)存分配和初始化。
到此這篇關(guān)于c++ static詳細分析的文章就介紹到這了,更多相關(guān)c++ static內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言 動態(tài)內(nèi)存開辟常見問題解決與分析流程
動態(tài)內(nèi)存是相對靜態(tài)內(nèi)存而言的。所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存2022-03-03
在C++中高效使用和處理Json格式數(shù)據(jù)的示例代碼
最近的項目在用c處理后臺的數(shù)據(jù)時,因為好多外部接口都在使用Json格式作為返回的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)描述,如何在c中高效使用和處理Json格式的數(shù)據(jù)就成為了必須要解決的問題,需要的朋友可以參考下2023-11-11
C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中串的模式匹配的相關(guān)資料,需要的朋友可以參考下2017-05-05
C語言數(shù)據(jù)結(jié)構(gòu)不掛科指南之隊列詳解
這篇博客主要介紹一下隊列的概念,并且采用 C 語言,編寫兩種存儲實現(xiàn)方式:順序存儲和鏈?zhǔn)酱鎯Γ?dāng)然還有常規(guī)的隊列基本操作的實現(xiàn)算法2022-09-09

