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

C++ static成員詳解:靜態局部變量與類靜態成員

     編輯:C++ 入門

1. static局部變量

函數內部聲明,生命週期贯穿整個程序,初始化僅一次(首次經過定義語句時)。

size_t count_calls() {
    static size_t ctr = 0; // 僅初始化一次
    return ++ctr;
}

int main() {
    for(size_t i=0; i!=10; ++i)
        cout << count_calls() << endl; // 輸出 1 2 3 ... 10
}

特性:保持跨調用狀態,線程不安全(C++11起局部static初始化線程安全)。

2. 類static成員

優勢

  • 不破壞封裝(非全局變量)
  • 屬於類而非對象,節省內存
  • 訪問受類訪問控制(private/protected/public)

聲明與定義

class Account {
public:
    void applyInterest() { amount += amount * interestRate; }
    static double rate() { return interestRate; }
    static void rate(double newRate) { interestRate = newRate; }
private:
    static double interestRate; // 聲明
    double amount;
};

// 類外定義(必須,且僅一次)
double Account::interestRate = 0.05; 

// 使用
Account::rate(0.07);      // 類名調用
Account ac; ac.rate();    // 對象調用
Account* p = ∾ p->rate(); // 指針調用

static成員函數特點

  • **無this指針**
  • 不能聲明為const/volatile/virtual
  • 只能訪問static成員
  • 可作為普通函數指針:`double (*pf)() = &Account::rate;`

static數據成員

  • 可為任意類型
  • **必須在類外定義初始化**(const整型除外)
  • 可作為默認實參:`void f(int x = Account::interestRate);`

3. 特殊:const static整型成員

**唯一可在類內初始化的static成員**(需常量表達式):

class Account {
    static const int period = 30; // 類內初始化合法
    static double daily_tbl[period]; // 可用作數組維度
    // ...
};
// 若需取地址或綁定引用,仍需類外定義:
const int Account::period;

4. static成員不是對象組成部分

class Base { static int n; };
class Derived : public Base { };
// Base::n 和 Derived::n 為同一實體
// sizeof(Base) 不包含 n

5. 避免文件級static,改用匿名命名空間

// 舊式(C風格,不推薦)
static int file_global; // 僅本文件可見

// 現代C++(推薦)
namespace {
    int file_global; // 同樣文件級隔離
    struct LocalStruct { }; // 可用於類/結構體(static不能修飾類)
}

總結表

類型生命週期作用域初始化位置訪問方式
static局部變量程序結束函數內定義處(首次經過)直接名字
static數據成員程序結束類作用域類外(const整型可類內)類名::/對象./指針->
static成員函數無狀態類作用域類內/類外定義類名::/對象./指針->
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved