這里寫目錄標題
- static 關鍵字
- 靜態局部變量 vs 局部變量
- 靜態全局變量 vs 全局變量
- 靜態成員變量 vs 成員變量
- 靜態成員函數
- 單例模式
static 關鍵字
在此之前, 先了解一下 static 關鍵字
靜態局部變量 vs 局部變量
在靜態局部變量中,變量不會在函數調用結束后銷毀,值會保留
變量在函數調用結束后依然存在。
所以每個函數訪問的都是同一個 count 。但如果該函數是int count = 0; counter()將都是“函數已被調用1次”
#include <iostream>
using namespace std;void counter() {// 靜態局部變量 - 在函數調用之間保持值static int count = 0;count++; // 每次調用增加計數cout << "函數已被調用 " << count << " 次" << endl;
}int main() {counter(); // 輸出: 函數已被調用 1 次counter(); // 輸出: 函數已被調用 2 次counter(); // 輸出: 函數已被調用 3 次return 0;
}
.
.
.
靜態全局變量 vs 全局變量
靜態全局變量 - 只能在當前文件訪問
而全局變量 是任何文件都可以訪問的
#include <iostream>
using namespace std;// 靜態全局變量 - 只能在當前文件訪問
static int counter = 0;void increment() {counter++;cout << "計數器值: " << counter << endl;
}int main() {increment(); // 輸出: 計數器值: 1increment(); // 輸出: 計數器值: 2increment(); // 輸出: 計數器值: 3return 0;
}
.
.
.
.
靜態成員變量 vs 成員變量
基本上等同與靜態局部變量 與 局部變量:)
#include <iostream>
using namespace std;class Counter {
public:// 靜態成員變量聲明static int count;Counter() {count++; // 每次創建對象時增加計數}
};// 靜態成員變量定義和初始化(必須在類外)
int Counter::count = 0;int main() {cout << "初始計數: " << Counter::count << endl; // 0Counter obj1;cout << "創建obj1后: " << Counter::count << endl; // 1Counter obj2;cout << "創建obj2后: " << Counter::count << endl; // 2}
.
.
.
.
靜態成員函數
就是專門用來操作靜態成員變量的,函數的返回值就是靜態局部變量
靜態局部變量的作用你懂吧?
只用打出一個商標,后面的都是用同一個商標,這就是單例模式最重要的一點
static Singleton* getInstance(){ return &instance;}
.
.
.
.
單例模式
這里只討論線程安全下的懶漢模式
class Singleton
{
public:static Singleton* getInstance() // 靜態成員方法 #2{static Singleton instance; // 靜態局部變量 #3return &instance; //返回一個靜態局部變量的地址 #4}private:Singleton() { cout << "Singleton()" << endl; } //私有的構造函數 #1~Singleton() { cout << "~Singleton()" << endl; }Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};int main()
{Singleton* p1 = Singleton::getInstance(); Singleton* p2 = Singleton::getInstance(); Singleton* p3 = Singleton::getInstance();cout << p1 << endl;cout << p2 << endl;cout << p3 << endl;return 0;
}