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ù)不能訪問非靜態(tài)成員變量,只能訪問靜態(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í)際開發(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)可見。靜態(tài)局部變量的作用域是局部的,只在定義它們的函數(shù)內(nèi)可見。而靜態(tài)成員變量的作用域是類級(jí)別的,可以通過(guò)類名訪問。
總結(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-06Qt 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