對象從誕生到結束的這段時間,即對象的生存期。在生存期間,對象將保持其狀態(即數據成員的值),變量也將保持它的值不變,直到它們被更新爲止。
ios
做用範圍 | 用法及特色 |
---|---|
命名空間做用域 | 所聲明的對象都具備靜態生存期,無需再加static進行聲明 |
函數內部局部做用域 | 聲明靜態對象時,需加關鍵字static 如:static int i; 局部做用域中的靜態變量,當一個函數返回時,下次再調用時, 該變量還會保持上回的值,即便發生遞歸調用,也不會爲該變量 創建新的副本,該變量會在每次調用間共享 |
2.定義時未指定初值的基本類型靜態生存期變量,會被賦予0值進行初始化,
而對於動態生存期變量,不指定初值意味着初值不肯定,即隨機值
函數
1.可觀察不一樣變量的生存期和可見性
測試
#include <iostream> int i = 1;//i爲全局變量,具備靜態生存期 using namespace std; void Other() { //a、b爲局部靜態變量,具備全局的壽命,只在第一次調用函數時初始化 static int a = 2; static int b; //c爲局部變量,具備動態生存期,每次調用函數時,都會被從新初始化 int c = 10; a += 2; i += 32; c += 5; cout << "---Other---" << endl; cout << "i= " << i << endl; cout << "a= " << a << endl; cout << "b= " << b << endl; cout << "c= " << c << endl; } int main() { //a爲靜態局部變量,具備全局壽命 static int a; //b、c是局部變量,具備動態生存期 int b =-10; int c = 0; cout << "---MAIN---" << endl; cout << "i= " << i << endl; cout << "a= " << a << endl; cout << "b= " << b << endl; cout << "c= " << c << endl; c += 8; Other(); cout << "---MAIN---" << endl; cout << "i= " << i << endl; cout << "a= " << a << endl; cout << "b= " << b << endl; cout << "c= " << c << endl; i += 10; Other(); return 0; }
運行結果:
spa
2.具備靜態和動態生存期對象的時鐘
(1)clock的頭文件
code
//聲明一個包含時鐘類的命名空間 #ifndef clock_H #define clock_H namespace myspace { class Clock{ public: Clock(int newh,int newm,int news); Clock() { hour=0; mintue=0; second=0; } void settime(int newh,int newm,int news); void showtime(); private: int hour,mintue,second; }; } #endif
(2)頭文件內函數的實現
對象
#include<iostream> #include"clock.h" using namespace std; using namespace myspace; void Clock::settime(int newh, int newm, int news) { hour = newh; mintue = newm; second = news; } void Clock::showtime() { cout << hour << ":" << mintue << ":" << second << endl; }
(3)main函數測試
blog
#include<iostream> #include "clock.h" using namespace std; using namespace myspace;//使用自定義的命名空間,具備靜態生存期 int main() { Clock c;//myspace裏面的成員類 cout << "The First Time" << endl; c.showtime(); c.settime(2, 20, 30); cout << "The Second Time" << endl; c.showtime(); system("pause"); }
運行結果:
遞歸