靜态成員變量的初始化一定要在類外,原因:
因為靜态成員變量本身在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<<"static i="<<i<<endl;
//cout<<i<<endl;錯誤的
test();
cout<<j<<endl;//static和全局變量都是預設為0!
PS:全局變量和static修飾的變量都存儲在靜态存儲區。
<b>本文轉自 神迹難覓 51CTO部落格,原文連結:http://blog.51cto.com/ji123/1916388,如需轉載請自行聯系原作者</b>