乙個類成員函式的區域性靜態變數問題

2021-07-28 07:32:05 字數 1514 閱讀 4839

原文:

當時遇到的需求需要這樣處理:呼叫某個類物件的某個成員函式時,第一次有具體意義的,其他時候都是保持不變的、無意義的。這個需求可以看做是在呼叫某成員函式時,第一次進行初始化,其他時候不進行操作,即在首次呼叫時進行初始化,根據這點,很容易想到c/c++裡面的static變數,它的作用是保持變數內容的持久,儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。根據需求,使用static區域性變數,寫下如下**:

1

classt2

5void print()const;6

private:7

string

value;8};

910void t::print()const

1118

else

1922

}

即在類的成員函式中定義乙個區域性的靜態變數,使得第一次呼叫進行初始化,用以區分是否是第一次呼叫,之後執行else分支。執行下面的測試**,輸出結果見下圖:

1

int _tmain(int argc, _tchar*argv)

2

通過輸出可以看到,t1得到了想要的結果,但是兩次t2.print()都列印 "not first moon",這說明此時 bfirstcall 還是false。於是在print函式中列印bfirstcall位址的**:

1

void t::print()const210

else

1114 }

再次執行輸出如下:

看到四次呼叫print函式時列印的bfirstcall的位址相同,這說明類成員函式中的區域性靜態變數同樣屬於此函式,而不屬於某個物件,不會因為重新定義乙個t2物件,第一次呼叫 t2.print()時 bfristcall 是 true,不管是哪個t類物件,只在第一次呼叫 print()時,bfirstcall == ture。於是無奈對程式進行了修改,將bfristcall定義為類的靜態成員,每次建構函式是將其重置為true:

1

classt2

5void print()const;6

private:7

string

value;

8static

bool

bfirstcall;9};

10bool

t::bfirstcall;

1112

void t::print()const

1319

else

2023 }

執行測試**可以得到想要的結果:

但是這裡又出現了新的問題,即每次建構函式是將bfirstcall重置為true時,如果新定義乙個物件,並且沒有呼叫print()函式,那麼再次呼叫之前定義物件的print()函式,會產生與預期相反的結果,考慮如下測試**:

1

int _tmain(int argc, _tchar*argv)

2

執行輸出如下:

目前解決辦法是在類中定義為普通成員

Python 類變數,成員變數,靜態變數,區域性變數

區域性 class testclass object val1 100 def init self self.val2 200 def fcn self,val 400 val3 300self.val4 val self.val5 500 if name main inst testclass p...

Python 類變數,成員變數,靜態變數,區域性變數

class member num 0 類變數,可以直接用類呼叫,或用例項物件呼叫 def init self,x,y self.x x 例項變數 成員變數 需要它是在類的建構函式內以self.開頭來定義的 self.y y self.fuc self.x,self.y defadd self tot...

成員變數和區域性變數,靜態變數的區別

成員變數和區域性變數,靜態變數的區別 1.成員變數和區域性變數的區別 1 在類中的位置不同 成員變數 在類中方法外 區域性變數 在方法定義中或者方法宣告上 2 在記憶體中的位置不同 成員變數 在堆記憶體 成員變數屬於物件,物件進堆記憶體 區域性變數 在棧記憶體 區域性變數屬於方法,方法進棧記憶體 3...