對象的生存期ios
·概念:對象從產生到結束的這段時間就是它的生存期。在對象生存期內對象將保持它的值,直到被更新爲止。對象的生存期能夠分爲靜態生存期和動態生存期兩種。 函數
1、 靜態生存期spa
·概念:若是對象的生存期與程序的運行期相同,則稱它具備靜態生存期。code
1. 這種生存期與程序的運行期相同。在文件做用域中生命的對象具備這種生存期。在函數內部聲明靜態生存期對象,要冠以關鍵字static。對象
2. 寫法:blog
static int i;遞歸
注:此時定義的變量i即是具備靜態生存期的變量,也稱爲靜態變量。作用域
也可賦初值:io
static int i = 5;class
3.
① 靜態變量的特色:
它不會隨着每次函數調用而產生一個副本,也不會隨着函數返回而失效。即便發生了遞歸調用,第n次調用函數時,靜態變量的值爲第n-1次調用靜態變量的值。(也就是說:靜態變量第一次賦值有效,也只能賦值一次。)
② 定義時未指定初值的基本類型靜態生存期變量,會被賦予0值初始化,而對於動態生存期變量,不指定初值意味着初值不肯定。
③ 全局變量爲靜態變量,局部變量通常爲動態的。
④ 類的對象成員也有各自的生存期,不用static修飾的成員對象,其生存期與它們所屬對象的生存期保持一致。
代碼:
1 #include <iostream> 2 using namespace std; 3 4 int i = 1; //i爲全局變量,具備靜態生存期 5 int main() 6 { 7 static int a; //a爲靜態局部變量,具備全局壽命,局部可見 8 int b = -10; //b,c爲局部變量,具備動態生存期 9 int c = 0; 10 11 void other(void); 12 13 cout << "-----MAIN------" << endl; 14 cout << "i=" << i << " a=" << a << " b=" << b << " c=" << c << endl; 15 16 c = c + 8; 17 other(); 18 cout << "-----MAIN-------" << endl; 19 cout << "i=" << i << " a=" << a << " b=" << b << " c=" << c << endl; 20 21 i = i + 10; 22 other(); 23 return 0; 24 25 } 26 27 void other(void) 28 { 29 //a,b爲靜態局部變量,具備全局壽命,局部可見,只第一次進入函數是被初始化 30 static int a = 2; 31 static int b; 32 33 int c = 10; 34 a = a + 2; 35 i = i + 32; 36 c = c + 5; 37 38 cout << "-----OTHER-----" << endl; 39 cout << "i=" << i << " a=" << a << " b=" << b << " c=" << c << endl; 40 b = a; 41 42 }
運行結果:
2、 動態生存期
·概念:塊做用域中生命的,沒有用static修飾的對象是動態生存期的對象。(習慣稱爲局部生存期對象)
1. 誕生於聲明點,結束於命名該標識符的做用域結束處。(聲明所在的塊執行完畢之時)
2. 具備靜態、動態生存期對象的時鐘程序:
1 #include <iostream> 2 3 using namespace std; 4 5 class Clock 6 { 7 public: 8 Clock(); 9 void SetTime(int NewN, int NewM, int NewS); 10 void ShowTime(); 11 ~Clock() {} 12 private: 13 int Hour, Minute, Second; 14 }; 15 16 Clock::Clock() 17 { 18 19 } 20 21 void Clock::SetTime(int NewN, int NewM, int NewS) 22 { 23 Hour = NewN; 24 Minute = NewM; 25 Second = NewS; 26 } 27 28 void Clock::ShowTime() 29 { 30 cout << Hour << ":" << Minute << ":" << Second << endl; 31 } 32 33 Clock globClock; 34 35 int main(int argc, char* argv[]) 36 { 37 38 cout << "First Time Output:" << endl; 39 40 globClock.ShowTime(); 41 globClock.SetTime(8, 10, 15); 42 Clock myClock(globClock); 43 44 cout << "Second Time Output:" << endl; 45 myClock.ShowTime(); 46 return 0; 47 }
運行結果:
注:就生存期而言,除了具備命名空間做用域的對象globGlock具備靜態生存期,與程序的運行期相同以外,其他都具備動態生存期。