寫在前面:
如果您只是想回顧或了解一下static和全局變量的異同點(diǎn),那么下面的總結(jié)將滿足您的需求。
如果您是一位初學(xué)者或?qū)Χ叩氖褂媚@鈨煽桑ㄗh您讀完該篇文章,相信這一篇將解答完您對于static關(guān)鍵字以及全局變量的所有疑惑。
如有問題或建議歡迎評論 or 私信 or Contact me:jerome.zhou@nio.com~~~
Static關(guān)鍵字和全局變量異同點(diǎn):
存儲位置:全局變量和靜態(tài)變量都存儲在內(nèi)存的靜態(tài)存儲區(qū)。
生命周期:全局變量和靜態(tài)變量的生命周期都是整個(gè)程序的執(zhí)行期間。
作用域:
- 全局變量:全局變量在整個(gè)程序中都是可見的,可以在任何函數(shù)中訪問。
- 靜態(tài)變量:靜態(tài)變量的作用域僅限于聲明它的函數(shù)或文件。如果在函數(shù)內(nèi)部聲明靜態(tài)變量,那么該靜態(tài)變量只在該函數(shù)內(nèi)部可見;如果在文件內(nèi)部聲明靜態(tài)變量,那么該靜態(tài)變量只在該文件內(nèi)部可見。
初始化:
- 全局變量:如果沒有初始化,編譯器會自動初始化為0。
- 靜態(tài)變量:如果沒有初始化,編譯器也會自動初始化為0。類內(nèi)成員變量,需要類內(nèi)聲明,類外定義(定義時(shí),可以使用默認(rèn)初始化)
聲明方式:
- 全局變量:全局變量在所有函數(shù)外部聲明。
- 靜態(tài)變量:在變量類型前加上關(guān)鍵字
static
來聲明靜態(tài)變量(可在任意位置)。使用場景:
- 全局變量:當(dāng)需要在多個(gè)函數(shù)或文件中共享數(shù)據(jù)時(shí),可以使用全局變量。
- 靜態(tài)變量:當(dāng)需要保持變量的值在函數(shù)調(diào)用之間不變時(shí),可以使用靜態(tài)變量。
總的來說,全局變量和靜態(tài)變量都有全局的生存期,但是靜態(tài)變量的作用域可以是局部的,因此靜態(tài)變量相對于全局變量來說,可以更好地保護(hù)數(shù)據(jù),減少了數(shù)據(jù)被誤操作的風(fēng)險(xiǎn)。
1. 生命周期、作用域和初始化時(shí)機(jī)
生命周期:變量從定義到銷毀的時(shí)間范圍。堆內(nèi)存和棧內(nèi)存章節(jié),介紹了一下程序的內(nèi)存管理,有一部分是Global Segment(全局段)負(fù)責(zé)存儲靜態(tài)變量和全局變量,存儲在全局段的變量生命周期等于整個(gè)程序的運(yùn)行時(shí)間。
作用域: 變量的可見代碼區(qū)域(塊作用域、函數(shù)作用域、類作用域和全局作用域)。不管是在全局還是局部聲明的static變量都存放在程序的全局段,但是它的作用域卻不等同于生命周期,它的作用域決定于它所被定義的位置。
從上述兩點(diǎn)可以發(fā)現(xiàn),靜態(tài)變量和全局變量具有相同的全生命周期,存儲在內(nèi)存的靜態(tài)存儲區(qū),但是二者的作用域卻不盡相同。
初始化時(shí)機(jī):全局變量、文件域中的靜態(tài)變量、類中的成員靜態(tài)變量在main函數(shù)執(zhí)行前初始化(餓漢式);局部變量中的靜態(tài)變量在第一次調(diào)用時(shí)初始化(懶漢式)。
在類中聲明的靜態(tài)成員變量,還必須要在類外定義下才可以使用,否則會編譯報(bào)錯(cuò)。
- 靜態(tài)成員變量不屬于任何一個(gè)對象,對象的數(shù)據(jù)中不應(yīng)該包含靜態(tài)成員的數(shù)據(jù)。所以在定義類的時(shí)候不會給靜態(tài)變量分配內(nèi)存只是聲明,因此就要在其他地方分配即定義。
定義與聲明的區(qū)別:
聲明:向編譯器聲明(或介紹)了變量的名稱,類型,或者函數(shù)及其參數(shù)類型等信息。聲明并不分配存儲空間。你可以多次聲明同一個(gè)變量。
定義:它除了向編譯器聲明(或介紹)了變量的名稱,類型等信息外,還分配了存儲空間。換句話說,定義是聲明的擴(kuò)展。你只能一次定義一個(gè)變量。,也可以順便初始化。程序中變量有且只有一個(gè)定義(更能說明為什么要在類外再定義下類的靜態(tài)成員變量了)。
在C++中,如果你試圖多次定義同一個(gè)變量,編譯器會報(bào)錯(cuò)。但是,你可以多次聲明同一個(gè)變量,只要它在某個(gè)地方被定義過一次。
所以,所有的定義(包括變量和函數(shù))都是聲明,但并非所有的聲明都是定義。
2. 全局變量
全局變量是在所有函數(shù)外部定義的變量,其作用域是從定義點(diǎn)開始到文件結(jié)尾。全局變量可以被任何函數(shù)訪問和修改,即全局變量的生命周期是整個(gè)程序的執(zhí)行期間。
在C++中,全局變量的聲明和使用主要有以下幾點(diǎn)需要注意:
-
聲明全局變量:全局變量在所有函數(shù)之外定義,通常是在程序的開頭。例如:
int x;
-
使用全局變量:在任何函數(shù)中,直接使用變量名即可訪問全局變量。例如:
x = 10;
-
如果全局變量和局部變量同名,那么在局部作用域中,局部變量會覆蓋全局變量。如果想在局部作用域內(nèi)訪問全局變量,需要使用"::"全局作用域解析運(yùn)算符。例如:
::x = 20;
-
在一個(gè)文件中定義的全局變量,如果想在另一個(gè)文件中使用,需要在另一個(gè)文件中用關(guān)鍵字
extern
來聲明該全局變量。例如:extern int x;
其他文件不能再定義一個(gè)與其相同名字的變量了(否則編譯器會認(rèn)為它們是同一個(gè)變量)。 -
盡量避免使用全局變量,因?yàn)槿肿兞繒茐臄?shù)據(jù)的局部性,使得程序的理解和調(diào)試變得困難,同時(shí)也增加了數(shù)據(jù)的不安全性。
示例:
假設(shè)我們有兩個(gè)文件,一個(gè)是main.cpp,一個(gè)是other.cpp。
在main.cpp文件中,我們定義了一個(gè)全局變量,并在main函數(shù)中使用該全局變量。
// main.cpp
#include <iostream>
#include "other.cpp"
int x = 10; // 全局變量的定義
int main() {
std::cout << x << std::endl; // 使用全局變量
printX(); // 其他文件使用全局變量
return 0;
}
在other.cpp文件中,我們想要使用main.cpp中定義的全局變量x,因此其他文件中需要用extern關(guān)鍵字聲明該全局變量。
// other.cpp
#include <iostream>
extern int x; // 全局變量的聲明
void printX() {
std::cout << x << std::endl; // 使用全局變量
}
如果我們有一個(gè)局部變量和全局變量同名,那么在這個(gè)局部作用域中,局部變量會覆蓋全局變量。
// main.cpp
#include <iostream>
int x = 10; // 全局變量的定義
int main() {
int x = 20; // 局部變量的定義
std::cout << x << std::endl; // 輸出20,因?yàn)檫@里的x指的是局部變量
std::cout << ::x << std::endl; // 輸出10,使用::訪問全局變量
return 0;
}
3. Static 關(guān)鍵字
接下來是static關(guān)鍵字,筆者按照面向過程(不引入類的概念)和面向?qū)ο螅悆?nèi)的static)兩個(gè)角度展開static關(guān)鍵字的使用。
3.1 面向過程
3.1.1 靜態(tài)全局變量
在全局變量前,加上關(guān)鍵字static
,該變量就被定義成為一個(gè)靜態(tài)全局變量(相當(dāng)于限制作用域的全局變量:作用域僅為當(dāng)前文件內(nèi))。
#include <iostream>
using namespace std;
void fn();
static int n; // 定義靜態(tài)全局變量,默認(rèn)初始化為0
int main()
{
n = 20; // 全局靜態(tài)變量賦值
fn();
fn();
return 0;
}
void fn()
{
n++;
cout << n << endl;
}
>>> 21
>>> 22
靜態(tài)全局變量有以下特點(diǎn):
- 全生命周期,該變量在Global Segment中分配內(nèi)存;
- 默認(rèn)初始化,未經(jīng)初始化的靜態(tài)全局變量會被程序自動初始化為0(自動變量的自動初始化值是隨機(jī)的);
- 作用域有限, 靜態(tài)全局變量在聲明它的整個(gè)文件都是可見的,而在文件之外是不可見的;
- 靜態(tài)變量都在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存,包括后面將要提到的靜態(tài)局部變量。對于一個(gè)完整的程序,在內(nèi)存中的分布情況如下:【代碼區(qū)】【全局?jǐn)?shù)據(jù)區(qū)】【堆區(qū)】【棧區(qū)】,一般程序的由new產(chǎn)生的動態(tài)數(shù)據(jù)存放在堆區(qū),函數(shù)內(nèi)部的自動變量存放在棧區(qū),靜態(tài)數(shù)據(jù)(即使是函數(shù)內(nèi)部的靜態(tài)局部變量)存放在全局?jǐn)?shù)據(jù)區(qū)。自動變量一般會隨著函數(shù)的退出而釋放空間,而全局?jǐn)?shù)據(jù)區(qū)的數(shù)據(jù)并不會因?yàn)楹瘮?shù)的退出而釋放空間。
static int n; //定義靜態(tài)全局變量
改為
int n; //定義全局變量
程序照樣正常運(yùn)行。
定義全局變量就可以實(shí)現(xiàn)變量在文件中的共享,但定義靜態(tài)全局變量還有以下好處:
- 靜態(tài)全局變量不能被其它文件所用;
- 其它文件中可以定義相同名字的變量,不會發(fā)生沖突;
將上述示例代碼改為如下:
#include <iostream.h>
void fn();
static int n; //定義靜態(tài)全局變量
int main()
{
n=20;
cout << n <<endl;
fn();
return 0;
}
//File2
#include <iostream.h>
extern int n;
void fn()
{
n++;
cout << n << endl;
}
編譯并運(yùn)行,會發(fā)現(xiàn)上述代碼可以分別通過編譯,但運(yùn)行時(shí)出現(xiàn)錯(cuò)誤。 這就是因?yàn)殪o態(tài)全局變量不能被其它文件所用,即使在其它文件中使用extern 進(jìn)行聲明也不行。
將
static int n; //定義靜態(tài)全局變量
改為
int n; //定義全局變量
再次編譯運(yùn)行程序,程序可正常運(yùn)行。
因此,在一個(gè)文件中,靜態(tài)全局變量和全局變量功能相同;而在兩個(gè)文件中,要使用同一個(gè)變量,則只能使用全局變量而不能使用靜態(tài)全局變量。
3.1.2 靜態(tài)局部變量(單例中會使用)
感興趣的小伙伴可以看一下單例。
在局部變量前,加上關(guān)鍵字static
,該變量就被定義成為一個(gè)靜態(tài)局部變量(作用域更狹窄的全局變量:全生命周期,局部變量的作用域)。
//Example 3
#include <iostream>
void fn();
void fn_local();
int main()
{
fn(); //10
fn(); //11
fn(); //12
fn_local(); //10
fn_local(); //10
return 0;
}
void fn()
{
static int n = 10;
std::cout << n << std::endl;
n++;
}
void fn_local()
{
int n = 10;
std::cout << n << std::endl;
n++;
}
在函數(shù)fn_local()
定義了一個(gè)變量,每當(dāng)程序運(yùn)行到該語句時(shí)都會給該局部變量分配棧內(nèi)存。但隨著程序退出函數(shù)體,系統(tǒng)就會收回棧內(nèi)存,局部變量也相應(yīng)失效。
但有時(shí)候我們需要在兩次調(diào)用之間對變量的值進(jìn)行保存。通常的想法是定義一個(gè)全局變量來實(shí)現(xiàn)。但這樣一來**,變量已經(jīng)不再屬于函數(shù)本身了,不再僅受函數(shù)的控制,**這給程序的維護(hù)帶來不便。
靜態(tài)局部變量正好可以解決這個(gè)問題。靜態(tài)局部變量保存在全局?jǐn)?shù)據(jù)區(qū),而不是保存在棧中,每次的值保持到下一次調(diào)用,直到下次賦新值。
靜態(tài)局部變量有以下特點(diǎn):
- 靜態(tài)局部變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存;
- 靜態(tài)局部變量在程序執(zhí)行到該對象的聲明處時(shí)被首次初始化,即以后的函數(shù)調(diào)用不再進(jìn)行初始化;
- 靜態(tài)局部變量一般在聲明處初始化,如果沒有顯式初始化,會被程序自動初始化為0;
- 靜態(tài)局部變量始終駐留在全局?jǐn)?shù)據(jù)區(qū),直到程序運(yùn)行結(jié)束。但其作用域?yàn)?strong>局部作用域,當(dāng)定義它的函數(shù)或語句塊結(jié)束時(shí),其作用域隨之結(jié)束;
3.1.3 靜態(tài)函數(shù)
在函數(shù)的返回類型前加上static
關(guān)鍵字,函數(shù)即被定義為靜態(tài)函數(shù)。靜態(tài)函數(shù)與普通函數(shù)不同,它只能在聲明它的文件當(dāng)中可見,不能被其它文件使用。
#include <iostream>
static void fn();//聲明靜態(tài)函數(shù)
int main()
{
fn();
return 0;
}
void fn()//定義靜態(tài)函數(shù)
{
int n = 10;
std::cout << n << std::endl;
}
定義靜態(tài)函數(shù)的好處:(類似于靜態(tài)全局變量)
- 靜態(tài)函數(shù)不能被其它文件所用;
- 其它文件中可以定義相同名字的函數(shù),不會發(fā)生沖突
3.2 面向?qū)ο?/h4>
3.2.1 類內(nèi)靜態(tài)成員變量
在類內(nèi)成員變量的聲明前加上關(guān)鍵字static
,該數(shù)據(jù)成員就是類內(nèi)的靜態(tài)數(shù)據(jù)成員。
#include <iostream>
class Myclass
{
public:
Myclass(int a, int b, int c);
void GetSum();
private:
int a, b, c;
static int Sum; // 聲明靜態(tài)數(shù)據(jù)成員 important!?。?此處僅進(jìn)行了聲明
};
// 沒有類對象時(shí),作用域就可見。
int Myclass::Sum = 0; // 定義并初始化靜態(tài)數(shù)據(jù)成員,類外初始化(const static 可以類內(nèi)初始化)
Myclass::Myclass(int a, int b, int c)
{
this->a = a; // 同名變量賦值需要用this指針
this->b = b;
this->c = c;
Sum += a + b + c;
}
void Myclass::GetSum()
{
std::cout << "Sum=" << Sum << std::endl;
}
int main()
{
Myclass M(1, 2, 3);
M.GetSum();
Myclass N(4, 5, 6);
N.GetSum();
M.GetSum();
return 0;
}
靜態(tài)成員變量有以下特點(diǎn):
- 靜態(tài)成員變量是該類的所有對象所共有的。對于普通成員變量,每個(gè)類對象都有自己的一份拷貝。而靜態(tài)成員變量一共就一份,無論這個(gè)類的對象被定義了多少個(gè),靜態(tài)成員變量只分配一次內(nèi)存,由該類的所有對象共享訪問。所以,靜態(tài)數(shù)據(jù)成員的值對每個(gè)對象都是一樣的,它的值可以更新;
- 因?yàn)殪o態(tài)數(shù)據(jù)成員在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存,由本類的所有對象共享,所以,它不屬于特定的類對象,不占用對象的內(nèi)存,而是在所有對象之外開辟內(nèi)存,在沒有產(chǎn)生類對象時(shí)其作用域就可見(類作用域)。因此,在沒有類的實(shí)例存在時(shí),靜態(tài)成員變量就已經(jīng)存在,我們就可以操作它;
- 靜態(tài)成員變量存儲在全局?jǐn)?shù)據(jù)區(qū)。static 成員變量的內(nèi)存空間既不是在聲明類時(shí)分配,也不是在創(chuàng)建對象時(shí)分配,而是在定義初始化時(shí)分配。靜態(tài)成員變量必須初始化,而且只能在類體外進(jìn)行。否則,編譯能通過,鏈接不能通過。在示例中,語句
int Myclass::Sum=0;
是定義并初始化靜態(tài)成員變量。初始化時(shí)可以賦初值,也可以不賦值。如果不賦值,那么會被默認(rèn)初始化,一般是 0 (int Myclass::Sum;
)。靜態(tài)數(shù)據(jù)區(qū)的變量都有默認(rèn)的初始值,而動態(tài)數(shù)據(jù)區(qū)(堆區(qū)、棧區(qū))的變量默認(rèn)是垃圾值。 - static 成員變量和普通 static 變量一樣,編譯時(shí)在靜態(tài)數(shù)據(jù)區(qū)分配內(nèi)存,到程序結(jié)束時(shí)才釋放。這就意味著,static 成員變量不隨對象的創(chuàng)建而分配內(nèi)存,也不隨對象的銷毀而釋放內(nèi)存。而普通成員變量在對象創(chuàng)建時(shí)分配內(nèi)存,在對象銷毀時(shí)釋放內(nèi)存。
- 靜態(tài)數(shù)據(jù)成員初始化與一般數(shù)據(jù)成員初始化不同。初始化時(shí)可以不加 static,但必須要有數(shù)據(jù)類型。被 private、protected、public 修飾的 static 成員變量都可以用這種方式初始化。靜態(tài)數(shù)據(jù)成員初始化的格式為:
<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>
- 類的靜態(tài)成員變量訪問形式1 (類已經(jīng)被實(shí)例化):
<類對象名>.<靜態(tài)數(shù)據(jù)成員名>
- 類的靜態(tài)成員變量訪問形式2:
<類類型名>::<靜態(tài)數(shù)據(jù)成員名
>,也即,靜態(tài)成員不需要通過對象就能訪問。 - 靜態(tài)數(shù)據(jù)成員和普通數(shù)據(jù)成員一樣遵從public,protected,private訪問規(guī)則;
- 如果靜態(tài)數(shù)據(jù)成員的訪問權(quán)限允許的話(即public的成員),可在程序中,按上述格式來引用靜態(tài)數(shù)據(jù)成員 ;
- sizeof 運(yùn)算符不會計(jì)算 靜態(tài)成員變量。
class CMyclass{
int n;
static int s;
}; //則sizeof(CMyclass)等于4
何時(shí)采用靜態(tài)數(shù)據(jù)成員?
設(shè)置靜態(tài)成員(變量和函數(shù))這種機(jī)制的目的是將某些和類緊密相關(guān)的全局變量和函數(shù)寫到類里面,看上去像一個(gè)整體,易于理解和維護(hù)。如果 想在同類的多個(gè)對象之間實(shí)現(xiàn)數(shù)據(jù)共享,又不要用全局變量,那么就可以使用靜態(tài)成員變量。也即,靜態(tài)數(shù)據(jù)成員主要用在各個(gè)對象都有相同的某項(xiàng)屬性的時(shí)候。比如對于一個(gè)存款類,每個(gè)實(shí)例的利息都是相同的。所以,應(yīng)該把利息設(shè)為存款類的靜態(tài)數(shù)據(jù)成員。這有兩個(gè)好處:
- 不管定義多少個(gè)存款類對象,利息數(shù)據(jù)成員都共享分配在全局?jǐn)?shù)據(jù)區(qū)的內(nèi)存,節(jié)省存儲空間。
- 一旦利息需要改變時(shí),只要改變一次,則所有存款類對象的利息全改變過來了。
你也許會問,用全局變量不是也可以達(dá)到這個(gè)效果嗎?
同全局變量相比,使用靜態(tài)數(shù)據(jù)成員有兩個(gè)優(yōu)勢:
- 靜態(tài)成員變量沒有進(jìn)入程序的全局命名空間,因此不存在與程序中其它全局命名沖突的可能,不會污染命名空間。
- 可以實(shí)現(xiàn)信息隱藏。靜態(tài)成員變量可以是private成員,而全局變量不能。
3.2.2 類內(nèi)靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)為類服務(wù)而不是為某一個(gè)類的具體對象服務(wù)。靜態(tài)成員函數(shù)與靜態(tài)成員變量一樣,都是類的內(nèi)部實(shí)現(xiàn),屬于類定義的一部分。普通成員函數(shù)必須具體作用于某個(gè)對象,而靜態(tài)成員函數(shù)并不具體作用于某個(gè)對象。
普通的成員函數(shù)一般都隱含了一個(gè) this指針(可以參見文章C++中的this指針和Python中的Self),this指針指向類的對象本身(指向?qū)嵗蟮膶ο蟮牡刂罚?,因?yàn)槠胀ǔ蓡T函數(shù)總是具體地屬于類的某個(gè)具體對象的。當(dāng)函數(shù)被調(diào)用時(shí),系統(tǒng)會把當(dāng)前對象的起始地址賦給 this 指針。通常情況下,this是缺省的。如函數(shù)fn()實(shí)際上是this->fn()。
與普通函數(shù)相比,靜態(tài)成員函數(shù)屬于類本身,而不作用于對象,因此它不具有this指針。正因?yàn)樗鼪]有指向某一個(gè)對象,所以它無法訪問屬于類對象的非靜態(tài)成員變量和非靜態(tài)成員函數(shù),它只能調(diào)用其余的靜態(tài)成員函數(shù)和靜態(tài)成員變量。從另一個(gè)角度來看,由于靜態(tài)成員函數(shù)和靜態(tài)成員變量在類實(shí)例化之前就已經(jīng)存在可以訪問,而此時(shí)非靜態(tài)成員還是不存在的,因此靜態(tài)成員不能訪問非靜態(tài)成員。
#include <iostream>
using namespace std;
class Student{
private:
char *name;
int age;
float score;
static int num; //學(xué)生人數(shù)
static float total; //總分
public:
Student(char *, int, float);
void say();
static float getAverage(); //靜態(tài)成員函數(shù),用來獲得平均成績
};
int Student::num = 0;
float Student::total = 0;
Student::Student(char *name, int age, float score)
{
this->name = name;
this->age = age;
this->score = score;
num++;
total += score;
}
void Student::say()
{
cout<<name<<"的年齡是 "<<age<<",成績是 "<<score<<"(當(dāng)前共"<<num<<"名學(xué)生)"<<endl;
}
// 類內(nèi)靜態(tài)成員函數(shù),智能訪問類內(nèi)靜態(tài)成員變量
float Student::getAverage()
{
return total / num;
}
int main()
{
(new Student("小明", 15, 90))->say();
(new Student("李磊", 16, 80))->say();
(new Student("張華", 16, 99))->say();
(new Student("王康", 14, 60))->say();
cout<<"平均成績?yōu)?"<<Student::getAverage()<<endl;
return 0;
}
>>> 小明的年齡是 15,成績是 90(當(dāng)前共1名學(xué)生)
李磊的年齡是 16,成績是 80(當(dāng)前共2名學(xué)生)
張華的年齡是 16,成績是 99(當(dāng)前共3名學(xué)生)
王康的年齡是 14,成績是 60(當(dāng)前共4名學(xué)生)
平均成績?yōu)?82.25
靜態(tài)成員函數(shù)的特點(diǎn):文章來源:http://www.zghlxwxcb.cn/news/detail-809372.html
- 出現(xiàn)在類外的函數(shù)定義時(shí)不能指定關(guān)鍵字static;
- 靜態(tài)成員之間可以相互訪問,即靜態(tài)成員函數(shù)(僅)可以訪問靜態(tài)成員變量、靜態(tài)成員函數(shù)、靜態(tài)變量;
- 靜態(tài)成員函數(shù)不能訪問非靜態(tài)成員函數(shù)和非靜態(tài)成員變量;
- 非靜態(tài)成員函數(shù)可以任意地訪問靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員;
- 由于沒有this指針的額外開銷,靜態(tài)成員函數(shù)與類的全局函數(shù)相比速度上會稍快;
- 調(diào)用靜態(tài)成員函數(shù),兩種方式:
- 通過成員訪問操作符(.)和(->),也即通過類對象或指向類對象的指針調(diào)用靜態(tài)成員函數(shù)。
- 直接通過類來調(diào)用靜態(tài)成員函數(shù)。<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>)。也即,靜態(tài)成員不需要通過對象就能訪問。
Reference
https://zhuanlan.zhihu.com/p/37439983文章來源地址http://www.zghlxwxcb.cn/news/detail-809372.html
到了這里,關(guān)于[開發(fā)語言][c++]:Static關(guān)鍵字和全局變量的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!