C++ static variable(靜態變數) 學習
在C++語言中, 我們可以在函式中(in function)使用static variable, 也可在class中將static variable 作為一個class的member(成員變數)。
當然我們亦可以用static去修飾函式, 類的成員函式(靜態成員函式, 此時用於處理類的靜態成員變數)等等。
首先看一個例子:
當我們才一個函式中宣告一個static的變數的時候(即static 為function scope), 那麼這個靜態變數的 lifetime 將開始於函式第一次呼叫開始, 一直到這個Program 執行結束.
即函式中的宣告並初始化的static變數只執行一次, 無論在Program呼叫多少次, 都只執行一次, 並該變數儲存在heap中。 發生修改就可以儲存。
#include <iostream>
using namespace std;
void display();
int main()
{
display();
display();
display();
display();
display();
return 0;
}
void display() {
static int counter = 0;
cout << "display function called " << ++counter << " times." << endl;
}
執行結果如下:
課件,宣告在函式內部的static 變數並不隨著函式的呼叫的結束而釋放掉。 static變數在程式中的位置是heap中。
而非在stack frame中。(這有點像函式中的動態分配(new)的變數, 不會隨著函式呼叫的結束而結束, 除非我們在函式內部delete了) .
(可以在code::blocks 除錯檢視靜態變數的變化。)
要想結束除錯, 直接點選下圖紅色叉即可:
NOTE: code::blocks 的一個快捷方式:
CTRL + D 表示複製當前行(或者選中的block), 貼上帶在緊接著的下面的位置。 舉一個簡單的例子:
如上圖選中, 按下CTRL + D 出現如下情況:
另外, 快捷鍵 CTRL + G, 為調到哪一行, 輸入先要調到的位置確認(Enter)即可。 很好用。
EX2:
當static為類的成員變數的時候, 必須在類外初始化, 不能再類內初始化。 另外, static variable 不管我們宣告瞭多少個該類物件, 我們只有一個copy的這個static 成員變數。
#include <iostream>
using namespace std;
class Human {
public:
static int human_count;
};
int Human::human_count = 0; // 因為是public, 所以可以這樣寫
int main() {
cout << Human::human_count; return 0;
}
執行結果為:
現在對上述程式修改, 用static variable 記錄下用該類宣告的物件的個數。
#include <iostream>
using namespace std;
class Human {
public:
static int human_count;
Human() {
human_count++;
}
void humanTotal() {
cout << "There are " << human_count << " peoples in the program. " << endl;
}
};
int Human::human_count = 0;
int main() {
cout << Human::human_count << endl;
Human anil;
anil.humanTotal();
Human he;
Human xin;
xin.humanTotal();
cout << Human::human_count << endl;
return 0;
}
執行結果如下:
相關文章
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- static靜態變數的理解變數
- 函式的靜態變數 static函式變數
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- C/C++ 靜態變數解析C++變數
- C#靜態建構函式及靜態變數學習C#函式變數
- 靜態變數和非靜態變數變數
- static 靜態變數引起 Laravel 中佇列一個 Bug變數Laravel佇列
- 靜態變數變數
- 靜態變數與靜態方法變數
- C++基礎::變數模板(variable template)C++變數
- C:static 關鍵字、靜態變數、跨類訪問資料變數
- iOS 靜變數static、全域性變數extern、區域性變數、例項變數iOS變數
- java static 與 static靜態程式碼塊Java
- static靜態方法的使用
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- C++類的靜態成員變數初始化C++變數
- 理解靜態區域性變數(static)在程式中的執行規則變數
- 靜態持續變數變數
- 靜態變數和Session變數Session
- static變數變數
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- C++ 靜態變數什麼時候完成初始化C++變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- js中的靜態變數JS變數
- 靜態全域性變數和全域性變數變數
- 靜態變數和例項變數區別?變數
- Java靜態變數在靜態方法內部無法改變值Java變數
- PHP 中 static 靜態屬性和靜態方法的呼叫PHP
- PHP 手冊 (類與物件) 學習筆記九:Static(靜態)關鍵字PHP物件筆記
- 全域性變數和靜態變數的區別變數
- Java 學習(09)--方法過載/建構函式/static 變數Java函式變數
- c#靜態類static class示例C#
- JNI/NDK開發指南(7):C/C++訪問Java例項變數和靜態變數C++Java變數
- Java靜態變數塊使用案例Java變數
- PHP的靜態變數介紹PHP變數
- VBA靜態變數與常量(轉)變數
- Java入門學習-學會使用靜態變數、掌握單例模式的用法和原理Java變數單例模式