對象的生存期

5.2 對象的生存期

何爲生存期?

對象從誕生到結束的這段時間,即對象的生存期。在生存期間,對象將保持其狀態(即數據成員的值),變量也將保持它的值不變,直到它們被更新爲止。
ios

靜態生存期

  • 定義:若是對象的生存期與程序運行期相同,則稱它具備靜態生存期。
  • 分類:
做用範圍 用法及特色
命名空間做用域 所聲明的對象都具備靜態生存期,無需再加static進行聲明
函數內部局部做用域 聲明靜態對象時,需加關鍵字static
如:static int i;
局部做用域中的靜態變量,當一個函數返回時,下次再調用時,
該變量還會保持上回的值,即便發生遞歸調用,也不會爲該變量
創建新的副本,該變量會在每次調用間共享
  • 注意:

    1.定義靜態變量的同時也能夠爲它賦初值

2.定義時未指定初值的基本類型靜態生存期變量,會被賦予0值進行初始化,
而對於動態生存期變量,不指定初值意味着初值不肯定,即隨機值


函數

動態生存期

  • 定義:局部生存期對象誕生於聲明點,結束於聲明所在的塊執行完畢結束
  • 注意:類的成員對象也有各自的生存期,不用static修飾的成員對象,其生存期都與它們所屬對象的生存期一致

實驗

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");
}

運行結果:

遞歸

相關文章
相關標籤/搜索