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