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)局部變量作為緩存,避免重復計算或頻繁的資源獲取操作。
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)文章
Qt QChart 創(chuàng)建圖表的實現(xiàn)方法
這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12