C++對象生存期&&static

生存期即從誕生到消失的時間段,在生存期內,對象的值或保持不變,知道改變他的值爲止。對象生存期分爲靜態生存期動態生存期兩種。ios

  • 靜態生存期

指對象的生存期與程序運行期相同。在namespace中聲明的對象都具備靜態生存期。可是,在函數內部做用域中聲明具備動態生存期的對象,要用static修飾,如static int a函數

在局部做用域中,靜態變量的特色是不會隨函數的每次調用而產生一個副本,同時也不會由於函數的返回而消失。該變量會一直保持上一個值,在每次調用中可共享。同時靜態變量在定義時也能夠賦值,如static int a = 3;spa

  • 動態生存期

除上述兩種狀況,其他爲動態生存期。在局部做用域中,有動態生存期的對象,也稱爲局部生存期對象。局部生存期對象誕生於聲明點,結束於聲明塊執行完畢。在類中不用static修飾的成員,他們的生存期和對象生存期一致。對象

例:blog

#include<iostream>
using namespace std;
int i =1;//i全局變量,動態生存期
void Other()
{
    static int a = 2;
    static int b ;//a,b爲靜態局部變量,全局壽命,局部可見,第一次進入函數時初始化
    int c = 10;//c局部變量,動態生存期,每次進入函數都初始化
    a+=2;
    i+=32;
    c+=5;
    cout<<"Other:"<<endl;
    cout<<"i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;
}
int main()
{
    static int a;//靜態局部變量,全局壽命,局部可見
    int b= -1;
    int c = 0;;//b,c局部變量,動態生存期
    cout<<"Main:"<<endl;
    cout<<"i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;
    c+=8;
    Other();
    cout<<"Main:"<<endl;
    cout<<"i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;
    i+=10;
    Other();
    return 0;
}

  運行結果作用域


 

類的靜態成員io

類的靜態成員是解決同一個類的不一樣對象之間數據和函數的共享問題的。如每生成一個對象,則計數+1,從而統計一共建立了多少個對象。class

  • 靜態數據成員

在類的一個屬性中,若是某個屬性爲整個類所共享,則用static修飾爲靜態成員。該成員在每一個類中只有一個副本,由全部對象共同維護,從而實現數據共享。stream

靜態數據成員具備靜態生存期,由於靜態數據成員不屬於任何對象,可經過類名訪問,」類名::標識符「。另外,在類定義中,僅進行引用性聲明,而在namespace做用域中使用類名限定定義性聲明,或初始化。(緣由:這樣定義是由於這種方式要專門分配空間,非靜態數據成員的空間與所屬對象空間是同時分配的,因此無須這樣定義)。變量

例:

#include<iostream>
using namespace std;
class Point
{
public:
    Point(int x  = 0,int y = 0):x(x),y(y)
    {
        count++;
    }
    Point(Point &p)//copy
    {
        x = p.x;
        y = p.y;
        count++;
    }
    ~Point()
    {
        count --;
    }
    int GetX(){return x;}
    int GetY(){return y;}
    void ShowCount()//靜態函數
    {
        cout<<"Object count :"<<count<<endl;
    }
private:
    static int  count;//static
    int x;
    int y;
};

int Point:: count = 0;//靜態數據成員的初始化,類名限定

int main()
{
    Point a(4,5);
    cout<<"Pont a:"<<"("<<a.GetX()<<","<<a.GetY()<<")"<<endl;
    a.ShowCount();//經過對象名
    Point b(a);
    cout<<"Pont b:"<<"("<<b.GetX()<<","<<b.GetY()<<")"<<endl;
    b.ShowCount();
    return 0;
}

  運行結果

  • 靜態函數成員

在上面例子中,ShowCount()是輸出count的值的,而在全部對象聲明前,count是==0的,那麼若是輸出這時的count,該怎麼作??因此這時靜態函數成員就起做用了。

修改以下:

class Point
{
public:
    .
    .
    .
    static void ShowCount()//靜態函數
    {
        cout<<"Object count :"<<count<<endl;
    }
private:
   ...
};

int Point:: count = 0;//靜態數據成員的初始化,類名限定
int main()
{   
    Point::ShowCount();
    Point a(4,5);
    cout<<"Pont a:"<<"("<<a.GetX()<<","<<a.GetY()<<")"<<endl;
    Point::ShowCount();
    Point b(a);
    cout<<"Pont b:"<<"("<<b.GetX()<<","<<b.GetY()<<")"<<endl;
    Point::ShowCount();
    return 0;
}

  運行結果

在ShowPoint()函數前加一個static,即變爲靜態成員函數,它也屬於整個類,有全部對象共同擁有,爲全部對象共享。靜態成員函數能夠用過類名|對象名訪問,非靜態成員函數只能經過對象名調用。

另外,靜態成員函數能夠直接訪問類的靜態數據和函數成員,而訪問非靜態成員,必須經過對象名。因此通常狀況下,靜態函數用來訪問類的靜態數據成員

相關文章
相關標籤/搜索