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;
}
執行結果如下:
相關文章
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- static 靜態變數引起 Laravel 中佇列一個 Bug變數Laravel佇列
- 靜態變數變數
- C:static 關鍵字、靜態變數、跨類訪問資料變數
- static靜態方法的使用
- C++類的靜態成員變數初始化C++變數
- 理解靜態區域性變數(static)在程式中的執行規則變數
- C++學習筆記(三):類與物件--靜態成員變數與常成員函式C++筆記物件變數函式
- Java自學入門之靜態變數Java變數
- 南京大學 靜態軟體分析(static program analyzes)-- introduction 學習筆記筆記
- C++ 靜態變數什麼時候完成初始化C++變數
- 延遲靜態繫結——static
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- Java靜態變數在靜態方法內部無法改變值Java變數
- PHP 手冊 (類與物件) 學習筆記九:Static(靜態)關鍵字PHP物件筆記
- Java 學習(09)--方法過載/建構函式/static 變數Java函式變數
- Java | 靜態巢狀類(Static Nested Class)Java巢狀
- Spring如何為靜態變數注入值Spring變數
- 對於systemverilog靜態變數和動態變數 ,描述不正確的是()。變數
- Flask 配置靜態資原始檔夾static_url_path、static_folderFlask
- Django 教程之media和static靜態檔案Django
- 反射修改 static final 變數反射變數
- C++靜態函式C++函式
- C語言--靜態區域性變數C語言變數
- Java逆向基礎之靜態變數存取Java變數
- SpringBoot static 靜態方法獲取 yml 配置檔案Spring Boot
- mysql 動態引數(Dynamic System Variable Summary)MySql
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- C++ 的靜態成員變數為什麼一定要在類外定義C++變數
- 關於單例及靜態變數測試單例變數
- TscanCode C/C++靜態分析C++
- C++ 定義靜態成員 static 關鍵字不能在定義出重複出現C++
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- ES6中類的靜態方法=> static 的使用
- 機器學習的靜態特徵和動態特徵機器學習特徵
- DTP filter的動態更新方法/Bex Variable/DTP中的過濾變數Filter變數
- Python學習-變數Python變數
- Shell 變數學習變數
- c++類的靜態成員C++