當前位置:編程學習大全網 - 編程語言 - 在c++中static是什麽意思?

在c++中static是什麽意思?

要理解static,首先要理解另壹個相對關鍵詞。很多人可能不知道這個關鍵詞的存在,就是auto。其實我們平時聲明的沒有靜態修改的變量都是auto,因為是默認的,就像short和long總是默認為int壹樣;我們通常聲明壹個變量:

int a;

字符串s;

事實上,它是:

auto int a;

自動字符串s;

而靜態變量的語句是:

靜態int a;

靜態字符串s;

這似乎更有利於理解auto和static是壹對關鍵詞,就像private、protected和public壹樣;

不懂static其實就是不懂auto,因為它更壹般;有些東西妳每天都在用,但不壹定代表妳真的懂;Auto是指程序自動控制變量的生命周期,通常是指變量在進入其作用域時被分配,離開其作用域時被釋放;Static不是auto,變量在程序初始化時分配,直到程序退出才釋放;即靜態是根據程序的生命周期分配和釋放變量,而不是變量本身的生命周期;所以,舉壹個這樣的例子:

void函數()

{

int a;

靜態int b;

}

每次調用函數時,變量A都是新的,因為它是在進入函數體時分配的,在退出函數體時釋放。所以多線程調用函數時,會有自己的自變量A,因為它總是會被重新分配。變量B是在程序初始化的時候分配的,不管妳用不用函數,或者第壹次聲明的時候(不同的編譯器可能不壹樣),所以多線程調用函數的時候總是訪問同壹個變量B,這是多線程編程必須註意的!

靜電的所有用途:

1.類的靜態成員:

A級

{

私人:

靜態int s _ value

};

它必須在cpp中初始化:

int A::s _ value = 0;//註意,這裏沒有靜態裝飾!

類的靜態成員是該類所有實例的* * *成員,即在該類的範疇內是壹個全局變量,也可以理解為壹個名為A::s_value的全局變量,但它具有類安全屬性;原因很簡單,因為是在程序初始化的時候分配的,所以只分配壹次,所以用於* * *;

類的靜態成員必須初始化,原因是壹樣的。因為它是在程序初始化時分配的,所以必須初始化。在cpp中,只有類中的聲明被初始化。您可以在已初始化的代碼上放置壹個斷點,並在程序執行main的第壹條語句之前到達該處。如果妳的靜態成員是壹個類,那麽它的構造函數將被調用;

2.類的靜態函數:

A級

{

私人:

靜態void func(int value);

};

實現的時候不需要修改static,因為static是壹個聲明性的關鍵字;

類的靜態函數是類的類別內的全局函數,不能訪問類的私有成員,只能訪問類的靜態成員,不需要類的實例就可以調用。其實就是壹個增加類訪問權限的全局函數:void a::func(int);

靜態成員函數可以被繼承和重寫,但不能是虛函數;

3.僅在cpp中有效的全局變量:

在cpp文件的全局範圍內聲明:

靜態int g _ value = 0;

該變量的含義在本cpp中有效,但其他cpp文件不能訪問該變量;如果兩個cpp文件聲明了同名的全局靜態變量,實際上是兩個自變量;

如果不使用static來聲明全局變量:

int g _ value = 0;

那麽就不能保證這個變量不會被其他cpp*** *共享,也不能保證它會被其他CPP * * * *共享,因為如果多個CPP * * *想要共享壹個全局變量,就應該聲明為extern(external);也有可能編譯器會報告變量被重復定義;簡而言之,不建議這樣寫,這個全局變量的用法也不清楚;

如果在頭文件中聲明:

靜態int g _ value = 0;

然後會為每個包含頭文件的cpp創建壹個全局變量,但是都是獨立的;所以不建議這樣寫,也不清楚如何使用這個變量,因為只創建了壹組同名但作用域不同的變量;

這裏順便說壹下,如何聲明can * * *可以享用的所有全局變量,並在頭文件中聲明為extern:

extern int g _ value//註意,不要初始化值!

然後在包含頭文件的任何cpp中初始化(壹次):

int g _ value = 0;//初始化時不要用extern修飾,因為extern也是聲明性關鍵字;

那麽所有包含頭文件的cpp文件都可以訪問同壹個名為g_value的變量;

4.僅在cpp中有效的全局函數:

在cpp中聲明:

靜態void func();

功能的實現不需要靜態修飾,所以這個功能只能在這個cpp中使用,不會和其他CPP中的同名功能沖突;原因是,如果不使用靜態,問題將與第3點相同;不要在頭文件中聲明靜態全局函數,也不要在cpp中聲明非靜態全局函數。如果您想在多個CPP中重用這個函數,請在頭文件中提及它的聲明,否則它需要在CPP中用static來修飾。這在C語言中很重要!

此外:

前陣子我在壹個程序裏用了static這個關鍵詞,就是靜態類成員。當時所有的對象都需要訪問壹個全局對象,所以我很自然的想到了靜態數據成員。靜態數據成員被認為是這個類的全局對象,每個類類型只有壹個副本,這個類的所有對象都可以訪問。

那麽它和全局變量相比有什麽優勢呢?

首先,靜態數據成員不會與程序中的其他全局名稱沖突,因為它包含在類中。

第二,靜態數據成員可以隱藏數據,數據可以是私有成員。

需要註意的是,靜態數據成員需要在類外初始化,但是shaped const靜態數據成員可以用類中的常量初始化。如果我們定義a類:

A級

{

........

私人:

靜態雙_ a;

靜態常數int _ b = 10;//初始化整形後的const靜態數據成員。

};

那我們應該這樣看:

雙A::_ A = 0;

const int static _ b;//但必須在類體外部定義。

希望對妳有幫助!

  • 上一篇:請幫我解釋幾個編程語言詞語
  • 下一篇:塑料瓶底部的數字是什麽意思?
  • copyright 2024編程學習大全網