首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ static 關鍵字全景指南:從 C 到 C++ 的六大用法

     編輯:關於C++

C 語言三大用法(實為兩類)

1. 靜態局部變量

  • 存儲於**全局數據區**,生命周期贯穿整個程序。
  • **首次**執行到聲明處初始化,之後調用保持值。
  • 作用域仍為局部,不可在函數外訪問。
  • 未顯式初始化則默認為 0。
int foo() {
    static int i = 1; // 僅初始化一次
    return ++i;
}

2. 靜態全局變量 / 靜態函數

  • 加 static 限制**連接屬性為內部連接**,僅在本編譯單元可見。
  • 實現**文件級封裝**,避免符號衝突。
  • 不同文件可定義同名靜態全局變量/函數,互不干擾。
// a.c
static int g_val = 10; // 僅 a.c 可見
static void helper() {}

// b.c
// extern int g_val; // 鏈接錯誤:找不到符號
int g_val = 20; // 另一個獨立變量

C++ 額外兩大用法

3. 靜態數據成員

  • 屬於**類**而非對象,全類共享**一份**拷貝。
  • 存儲於全局數據區,**不佔用對象內存**(sizeof 不計入)。
  • 必須在類外定義並初始化(int Class::member = 0;)。
  • 可通過 Class::member 或對象訪問。
class Rectangle {
    int w, h;
    static int totalArea; // 聲明
public:
    Rectangle(int w_, int h_) : w(w_), h(h_) { totalArea += w * h; }
    static int getTotal() { return totalArea; }
};
int Rectangle::totalArea = 0; // 定義

4. 靜態成員函數

  • 無 this 指針,**不能訪問非靜態成員**。
  • 可通過 Class::func() 或對象調用。
  • 主要用於操作靜態數據成員或作為工廠/工具函數。
class Singleton {
    static Singleton *instance;
    Singleton() {}
public:
    static Singleton* getInstance() {
        if (!instance) instance = new Singleton;
        return instance;
    }
};

對比總結表

用法作用域生命周期鏈接性典型場景
C 靜態局部塊級程序全期無鏈接函數內狀態保持
C 靜態全局/函數文件級程序全期內部鏈接模塊封裝、避免衝突
C++ 靜態數據成員類級程序全期外部鏈接共享狀態、計數器
C++ 靜態成員函數類級程序全期外部鏈接工廠、工具、單例
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved