C\C++里面的static:
面向過(guò)程的static:
在c和c++面向過(guò)程的設(shè)計(jì)里,在全局變量前加上static關(guān)鍵字則可將該變量定義為一個(gè)靜態(tài)全局變量,比如:
static int a;
那么c和c++中的靜態(tài)全局變量有什么特點(diǎn)呢:
1、變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存(局部變量在棧內(nèi),通過(guò)new和malloc動(dòng)態(tài)分配的變量在堆里);
2、未經(jīng)初始化的全局變量會(huì)被程序自動(dòng)初始化為0;
3、靜態(tài)全局變量或函數(shù)在聲明它的文件內(nèi)是可見(jiàn)的,在文件外是不可見(jiàn)的;(可以起到保護(hù)作用)
講講第三點(diǎn),如果我們只是在某個(gè)頭文件中聲明了一個(gè)普通的全局變量a,那么在引用這個(gè)頭文件的時(shí)候,我們也可以通過(guò)extern關(guān)鍵字將這個(gè)變量引用到當(dāng)前文件中;但是如果你在聲明那個(gè)變量的時(shí)候就加了static關(guān)鍵字,那么全局變量a對(duì)于其他任何文件都是不可見(jiàn)的。
同樣的,如果以static方式定義了一個(gè)函數(shù),那么這個(gè)函數(shù)只在定義它的文件內(nèi)可見(jiàn)。
面向?qū)ο蟮膕tatic:
在面向?qū)ο笤O(shè)計(jì)里面,使用static有幾點(diǎn)要注意:
1、靜態(tài)成員函數(shù)的聲明在類內(nèi)要加上static關(guān)鍵字,但是在類外實(shí)現(xiàn)的時(shí)候不需要;
2、靜態(tài)成員函數(shù)沒(méi)有this指針,所以不要嘗試顯示或隱式地在靜態(tài)成員函數(shù)內(nèi)引用這個(gè)指針,這種做法會(huì)導(dǎo)致編譯期間報(bào)錯(cuò)。因此也就不要嘗試些什么在構(gòu)造函數(shù)中給靜態(tài)成員變量初始化的動(dòng)作了。
下面寫個(gè)小例子感受一下面向?qū)ο蟮膕tatic:
首先定義一個(gè)頭文件account.h,在頭文件中定義一個(gè)類:
#pragma once
class Account
{
public:
static void reiseInterest(double var );
static double interest(){return dInterest; } //類內(nèi)給出實(shí)現(xiàn),語(yǔ)句簡(jiǎn)單,無(wú)遞歸,與類外實(shí)現(xiàn)并聲明為inline函數(shù)都是相同的,均為內(nèi)聯(lián)函數(shù)
private:
static double dInterest ;
};
double Account::dInterest = 5; //靜態(tài)數(shù)據(jù)成員初始化
inline void Account::reiseInterest(double var)
{
dInterest += var;
}
接著在源文件中進(jìn)行測(cè)試:
#include
#include "account.h"
using namespace std;
int main()
{
//double Account::dInterest = 5; //錯(cuò)誤?。tatic關(guān)鍵字限制了可視域??!
cout<<"The initial interest is "<
Account ac1;
Account ac2;
ac1.reiseInterest(18);
ac2.reiseInterest(17);
cout<<"The current interest is "<
return 0;
}
運(yùn)行結(jié)果如下: