c++ static詳細(xì)使用分析
一.定義
在C++中,
static是一個(gè)關(guān)鍵字,用于聲明靜態(tài)成員、靜態(tài)局部變量以及靜態(tài)函數(shù)。
二.各種類型分析
1.靜態(tài)成員變量:
- 靜態(tài)成員變量是類的屬性,它在所有類實(shí)例之間共享,只有一個(gè)副本。
- 靜態(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,因?yàn)閏ount是靜態(tài)成員變量,被所有類實(shí)例共享
return 0;
}2.靜態(tài)局部變量:
- 靜態(tài)局部變量在函數(shù)內(nèi)部聲明,并在程序的整個(gè)生命周期內(nèi)保持其值,而不是在每次函數(shù)調(diào)用時(shí)重新初始化。
- 靜態(tài)局部變量只在函數(shù)第一次被調(diào)用時(shí)初始化,之后保持其值。
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ù),不依賴于類的實(shí)例,可以直接通過(guò)類名調(diào)用。
- 靜態(tài)函數(shù)不能訪問(wèn)非靜態(tài)成員變量,只能訪問(wèn)靜態(tài)成員變量。
class MyClass {
public:
static void myStaticFunction() {
cout << "This is a static function." << endl;
}
};
int main() {
MyClass::myStaticFunction(); // 直接通過(guò)類名調(diào)用靜態(tài)函數(shù)
return 0;
}三.實(shí)際開(kāi)發(fā)中static的用法
1.單例模式(Singleton Pattern):
使用靜態(tài)成員函數(shù)和靜態(tài)成員變量創(chuàng)建單例類,確保只有一個(gè)實(shí)例存在。
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
void doSomething() {
// ...
}
private:
Singleton() {} // 私有構(gòu)造函數(shù),防止外部創(chuàng)建實(shí)例
};
int main() {
Singleton& obj = Singleton::getInstance();
obj.doSomething();
return 0;
}2.計(jì)數(shù)器變量:
使用靜態(tài)成員變量實(shí)現(xiàn)計(jì)數(shù)器功能,用于統(tǒng)計(jì)類的實(shí)例數(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ù),不依賴于類的實(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ù)計(jì)算或頻繁的資源獲取操作。
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)存分配時(shí)機(jī)是不同的。
1.靜態(tài)成員變量的內(nèi)存分配:
- 靜態(tài)成員變量在程序啟動(dòng)時(shí)進(jìn)行內(nèi)存分配,無(wú)論是否創(chuàng)建類的實(shí)例。
- 內(nèi)存分配發(fā)生在程序的靜態(tài)數(shù)據(jù)區(qū)(static data segment)。
- 靜態(tài)成員變量的初始化在其首次使用之前進(jìn)行,通常在程序啟動(dòng)時(shí)進(jìn)行。
2.靜態(tài)局部變量的內(nèi)存分配:
- 靜態(tài)局部變量在其所在的函數(shù)第一次被調(diào)用時(shí)進(jìn)行內(nèi)存分配。
- 內(nèi)存分配發(fā)生在程序的靜態(tài)數(shù)據(jù)區(qū)。
- 靜態(tài)局部變量只在首次調(diào)用時(shí)進(jìn)行初始化,之后保持其值。
需要注意的是,靜態(tài)局部變量和靜態(tài)成員變量的內(nèi)存分配和初始化時(shí)機(jī)是在編譯時(shí)確定的,與程序的執(zhí)行流程無(wú)關(guān)。靜態(tài)局部變量和靜態(tài)成員變量的生命周期和作用域與其所在的函數(shù)或類相關(guān)。
另外,靜態(tài)局部變量和靜態(tài)成員變量的作用域是在定義它們的函數(shù)或類范圍內(nèi)可見(jiàn)。靜態(tài)局部變量的作用域是局部的,只在定義它們的函數(shù)內(nèi)可見(jiàn)。而靜態(tài)成員變量的作用域是類級(jí)別的,可以通過(guò)類名訪問(wèn)。
總結(jié)起來(lái),靜態(tài)成員變量在程序啟動(dòng)時(shí)進(jìn)行內(nèi)存分配和初始化,而靜態(tài)局部變量在其所在函數(shù)第一次被調(diào)用時(shí)進(jìn)行內(nèi)存分配和初始化。
到此這篇關(guān)于c++ static詳細(xì)分析的文章就介紹到這了,更多相關(guān)c++ static內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何寫好C main函數(shù)的幾個(gè)注意事項(xiàng)
這篇文章主要介紹了如何寫好C main函數(shù)的幾個(gè)注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法
這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

