C 類的 static變數

2021-07-09 13:43:31 字數 1253 閱讀 4069

using system;

namespace teststatic

static void main(string args)

",i);

console.writeline("j=", new class1().j);

console.read();}}

}上面的**是乙個網友告訴我的,讓我看看結果,我看了一眼馬上說結果是   

i=1   

j=1   

網友執行後說結果是   

i=0   

j=1   

我嚇了一跳,認真看了**,原來自己真的錯了。   

下面我解釋一下為什麼是後一種結果   

對乙個類來說,static變數是與物件無關的,那麼它們什麼時候被初始化呢?就是在第一次引用的時候。當類生成物件的時候,可以簡單分成3步   

1,為所有static變數分配記憶體,這個時候記憶體裡面的值是該變數型別的預設值。關於不同值型別的預設值大家可以去查相關資料,注意值型別和引用型別是不同的。   

2,為static變數賦值,同樣要注意值型別和引用型別是不同的。   

3,生成物件,呼叫建構函式,先呼叫這個類的父類的建構函式,然後呼叫類本身的建構函式,生成物件。   

現在分析上面的**:   

console.writeline(string.format("i=",i));這裡i是static變數,而且類class1是第一次被引 用,按照上面說的三步,要先為class1裡面所有的static變數分配記憶體。儘管現在有超執行緒技術,但是指令在邏輯還是一條一條的按順序執行的,所以 先為static   int   i分配記憶體,並且在該記憶體中保持int的預設值0,接著再為static   int   num   變數分配記憶體,值當然也為0。   

然後執行第二步,為變數賦值:先為static   int   i變數賦值,i=getnum(),看getnum裡面的**,就是return   num,這個時候num的值是0,於是i就為0了。然後對變數num賦值,num=1;這行**執行後,num就為1了。分析到這裡我就不繼續分析了,大 家很容易看出結果是什麼。   

稍微熟悉c#的人,只要認真看**,肯定不會出錯,但是如果拿來考人,相信很多人會做錯。我認為這個問題簡單得算不上乙個技術問題,所以放在非技術區。之 所以在上面說那麼多廢話來分析,是想說明在程式設計的時候,即使非常熟悉、非常基本的東西,也要認真。事實上對static   值型別變數不直接賦值,而通過方法來賦值,是不常用或者是有點bt(**)的做法,但是我仍然很佩服出題的人,畢竟目的只是為了理解static變數。 

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...

類中static變數和成員變數

要理解標題,我們首先來看下static變數本身的特殊之處,即它儲存在全域性資料區。在類中的static變數也是如此。c 的記憶體分布 區 函式體的二進位制 全域性資料區 全域性變數和static變數 堆 動態記憶體分配 通過new 棧 區域性變數 常量區 字元 文字常量 這之後我們先通過 觀察一下區...