天天看點

靜态成員

靜态成員變量的初始化一定要在類外,原因:

    因為靜态成員變量本身在main函數未開始時已經存在。不要讓成員變量的初始化依賴于對象。不用對象,難到就不能用這一變量了嗎?

如果将初始化放在類内。那麼當不聲明對象時,無法使用這一靜态變量。編譯器報錯為‘undeclared identifier’。

#include<iostream>

using namespace std;

class B{

public:

static void Add(){i++;}

//靜态成員函數隻可以使用靜态成員變量,因為靜态成員函數沒有this指針,所有對象共享使用這一

//成員函數是以無法使用非靜态成員變量。因為每個非靜态成員變量在各個對象中都不同。

static int i;//靜态成員變量在類内聲明:

void out(){cout<<"static i="<<i<<endl;}

};

int B::i=0;//靜态成員變量一定要在類外初始化。

class D:private B{

void f(){

i=5;

        Add();

B::i++;//這裡靜态變量也可以直接用i++;

B::Add();

}

int main(){

B x;

D y;

x.Add();

x.out();

y.f();

cout<<"static i="<<B::i<<endl;//1.靜态成員變量的調用可直接用 “類名::變量名”

cout<<"static i="<<x.i<<endl;//2.也可用用對象名直接調用。

//cout<<"D中i的值:"<<y.i<<endl;//這是錯誤的,因為在y中i的通路權限是私有的所有無法用對

//象通路。

return 0;

static 的作用:

一、static 在代碼塊内聲明局部變量,作用域為代碼塊内。

其static的作用是聲明為靜态可持續變量,在程式中一直存在。

二、static 在代碼塊外聲明局部變量時,作用域為聲明處直到檔案結尾。

其static的作用是聲明為内部連結性,即不可以被程式的外部檔案調用。起到隐藏作用

<b>注意</b>未加<b>static的全局變</b><b>量和函數可以被外部程式通路!</b>

int j;//static duration,external linkage 可以被程式的外部檔案使用。

static int k;//static duration ,internal linkage,作用在以下所有程式,且隻可以本檔案使

//用。

void test(){

static int i;//static duration nolinage;隻作用于代碼塊内。靜态局部變量

cout&lt;&lt;"static i="&lt;&lt;i&lt;&lt;endl;

//cout&lt;&lt;i&lt;&lt;endl;錯誤的

test();

cout&lt;&lt;j&lt;&lt;endl;//static和全局變量都是預設為0!

PS:全局變量和static修飾的變量都存儲在靜态存儲區。

<b>本文轉自 神迹難覓 51CTO部落格,原文連結:http://blog.51cto.com/ji123/1916388,如需轉載請自行聯系原作者</b>

繼續閱讀