(一)在c語言中
靜態變數永遠只能初始化一次(執行時),但是可以多次賦值,
靜態變數的記憶體位址在編譯後就確定了。
(1)區域性靜態變數,存在於全域性資料區
example1:
#include int function()
int main()
}
輸出結果為11,12,13,14,15,16,17,18,19,20
紅色為定義,只定義一次。實現機制:為a記錄乙個是否初始化的狀態,看看彙編就知道了。
example2:
#include int function()
int main()
}
輸出結果為:1,1,1,1,1,1,1,1,1,1
紅色同樣為定義;但綠色為賦值不是定義。
(2)全域性靜態變數:存在於全域性資料區
全域性靜態變數具有檔案屬性,只屬於定義它的編譯單元。
example1:
static int aaa = 10;
static int aaa = 20;
不會有鏈結錯誤,但如果把static去掉那便有鏈結錯誤了
(3)全域性靜態函式:
具有檔案屬性,全域性變數同
(二)在c++中
(1)同c部分略
(2)static成員變數:有時需要全域性物件,但全域性物件破壞封裝,而且容易發生衝突。所以用static成員變數。
#ifndef _test_h_
#define _test_h_
class ctest
~ctest()
static int getaaa()
public:
static int aaa;
};#endif
#include "test.h"
#include using namespace std;
int main()
鏈結錯誤。
需要對靜態成員變數進行初始化,初始化方式與static const成員變數相同:
#ifndef _test_h_
#define _test_h_
class ctest
~ctest()
static int getaaa()
public:
static int aaa;
};int ctest::aaa = 10;
#endif
b.static資料成員可以是該成員所述的類型別。非static成員被限定宣告為其自身類物件的指標和引用。
class ctest;
class ctest
~ctest(){}
public:
static ctest test1;//ok
ctest* test2;//ok
ctest test3;//ok
}
c.static資料成員可用作預設實參:
#ifndef _test_h_
#define _test_h_
class ctest
~ctest()
static int getaaa()
void seta(int para = aaa)//ok,注意必須對aaa先進行初始化
public:
int a;
static int aaa;
};int ctest::aaa = 10;
#endif
(3)靜態成員函式
a.靜態成員函式沒有this形參,也就說沒法操作具體物件,所以靜態成員函式只能操作不屬於任何物件的static成員變數。
b.靜態成員函式不能被宣告為const。因為const是由指向const物件的const指標來實現的,but you know靜態成員函式是不能操作具體物件的,因為它沒有this指標作為其形參。
c.靜態成員函式不能被宣告為虛函式。虛函式存在的意義就是執行時多型,實現的機制是根據不同的物件呼叫不同的成員方法,靜態成員宣告為虛函式沒意義。
10進製VS2進製
對於乙個十進位制數a,將a轉換為二進位制數,然後按位逆序排列,再轉換為十進位制數b,我們乘b為a的二進位制逆序數。例如對於十進位制數173,它的二進位制形式為10101101,逆序排列得到10110101,其十進位制數為181,181即為173的二進位制逆序數。乙個1000位 即10 999 以內的...
65 題目1208 10進製 VS 2進製
題目描述 對於乙個十進位制數a,將a轉換為二進位制數,然後按位逆序排列,再轉換為十進位制數b,我們乘b為a的二進位制逆序數。例如對於十進位制數173,它的二進位制形式為10101101,逆序排列得到10110101,其十進位制數為181,181即為173的二進位制逆序數。輸入 乙個1000位 即10...
機試 10進製 VS 2進製
對於乙個十進位制數a,將a轉換為二進位制數,然後按位逆序排列,再轉換為十進位制數b,我們乘b為a的二進位制逆序數。例如對於十進位制數173,它的二進位制形式為10101101,逆序排列得到10110101,其十進位制數為181,181即為173的二進位制逆序數。乙個1000位 即10 999 以內的...