c語言中static的變數:
1).static區域性變數
a、
靜態區域性變數在函式內定義,生存期為整個程式執行期間,但作用域與自動變數相同,只能在定義該變數的函式內使用。退出該函式後, 儘管該變數還繼續存在,但不能使用它。
b、對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。
2).static全域性變數
全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。但是他們的作用域,非靜態全域性變數的作用域是整個源程式(多個原始檔可以共同使用); 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔(.h或.cpp)內有效, 在同一源程式的其它原始檔中不能使用它(注意,這一點和c++是不同的)。
關於c語言static變數的理解:
a、若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;
b、若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;
c、靜態變數和全域性變數放在程式的全域性資料區,而不是在堆疊中分配,所以不可能導致堆疊溢位;
d、設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題(執行緒不安全);
c++中靜態資料成員的特點有::
1、靜態資料成員僅僅在初始化時不受訪問許可權的約束;
2、靜態資料成員最好不要在.h檔案中進行定義(初始化),而是放在.cpp檔案中定義(初始化);
3、靜態資料成員被類的所有物件所共享,包括類的派生類的所有物件;——即派生類和基類共享乙個靜態成員。
4、靜態資料成員的型別可是所屬類自己,即在乙個類中可以宣告該類自己的型別的靜態成員物件,但是,不可以定義普通的成員物件,(指標可以)
5、在const成員函式中,
可以修改static成員變數的值
。普通成員變數的值,是不能修改的。
6、static成員函式只能訪問static成員,不能訪問非static成員,並且static成員函式不能定義為virtual、const、volatile 函式。
詳細分析如下:
類體中的資料成員的宣告前加上static關鍵字,該資料成員就成為了該類的靜態資料成員。
和其他資料成員一樣,靜態資料成員也遵守public/protected/private訪問規則。
注意::僅僅是
初始化時不遵守public/protected/private的規則。
即:如果是private和protected的靜態成員,只能通過public的靜態成員函式進行呼叫,而不能通過類名直接訪問了。
1、
靜態資料成員的定義(初始化)不能在標頭檔案中。
靜態資料成員實際上是類域中的全域性變數。所以,
靜態資料成員的定義(初始化)不應該被放在標頭檔案中。
其定義方式與全域性變數相同。舉例如下:
***.h檔案
class base
; ***.cpp檔案
const int base::_i=10;
//僅僅在定義(初始化)時不受private和protected訪問限制.
注:不要試圖在標頭檔案中定義(初始化)靜態資料成員。在大多數的情況下,
這樣做會引起重複定義這樣的錯誤。即使加上#ifndef #define #endif或者#pragma once也不行。
2、靜態資料成員 被 類 的所有物件所共享,
包括該類派生類的物件。即派生類物件與基類物件共享基類的靜態資料成員。舉例如下:
class base
;
int base::_num=0; //靜態資料成員的真正定義
class derived:public base
;
main()
;這個類要能建立物件,需要定義帶有引數初始化列表的建構函式,如下:
class base
};
4、靜態資料成員的值在const成員函式中可以被合法的改變,而不破那個資料成員的值,不能在const成員函式中改變。
#include
using namespace std;
class student
;
void student::change() const
int student::geta()
void student::setb(int b)
int student::getb()
int student::a = 5;
int main(int argc,char *argv)
{student stu;
stu.setb(10);
stu.change();
cout<
即:成員函式的const約束,只起作用於類的普通成員變數,對於全域性變數,成員函式引數,成員函式內部的臨時變數起不到作用。
C 中static成員變數
1 static成員變數屬於類,不屬於某個具體的物件,即使建立多個物件,也只為static成員變數分配乙個記憶體 所有物件都是這個記憶體裡的statiic變數,如果對其做出修改也會影響到其他物件的使用 2 static成員變數必須在類外進行初始化 形如 type class name value i...
C 類中static變數
using system namespace param stathread static void main string args i console.writeline string.format j new class1 j console.read 上面的 是乙個告訴我的,讓我看看結果,我...
c 類中static 型別變數使用
在c 語音中類的靜態資料成員在初始化時比較特殊,以為它並不是在類的定義中初始化,而是在類的定義外被初始化。如下示例 include iostream include string.h class test test char strname test char strname,int num cha...