c++ static 關鍵字
static 是C++中很常用的修飾符,它被用來控制變量的存儲方式和可見性。
面向過程中的static
在全局變量前,加上關鍵字static,該變量就被定義成為一個靜態全局變量。
#include
usingnamespace std;
void fn(); //聲明函數
static int n; //聲明靜態全局變量
void main()
{
n=20; //為n賦初值
printf("%d",n);//輸出n的值
fn(); //調用fn函數
}
void fn()
{
n++; //n的值自加一(n=n+1)
printf("%d",n); //輸出n的值
}
靜態全局變量的特點:未經初始化的靜態全局變量會被程序自動初始化為0(在函數體內聲明的自動變量的值是隨機的,除非它被顯式初始化,而在函數體外被聲明的自動變量也會被初始化為0); 靜態全局變量在聲明它的整個文件都是可見的,而在文件之外是不可見的;
注意:全局變量和全局靜態變量的區別
2)全局靜態變量是顯式用static修飾的全局變量,作用域是聲明此變量所在的文件,其他的文件即使用extern聲明也不能使用。
#include
void fn();
void main()
{
fn();
fn();
fn();
}
void fn()
{
static int n=10;
printf("%d",n);
n++;
}
靜態局部變量解決問題:在函數體內定義了一個變量,每當程序運行到該語句時都會給該局部變量分配棧內存。但隨著程序退出函數體,系統就會收回棧內存,局部變量也相應失效。或者是需要在兩次調用之間對變量的值進行保存。
有人會說,為什麼不用全局變涼呢?如果用全局變量,變量已經不再屬於函數本身了,不再僅受函數的控制,給程序的維護帶來不便。
靜態局部變量正好可以解決這個問題。靜態局部變量保存在全局數據區,而不是保存在棧中,每次的值保持到下一次調用,直到下次賦新值。
#include
static void fn();//聲明靜態函數
void main()
{
fn();
}
void fn()//定義靜態函數
{
intn=10;
printf("%d",n);
}
靜態函數和普通函數區別:它只能在聲明它的文件當中可見,不能被其它文件使用。其它文件中可以定義相同名字的函數,不會發生沖突;
面向對象中的static
在類內數據成員的聲明前加上關鍵字static,該數據成員就是類內的靜態數據成員。
#include
classMyclass
{
public:
Myclass(inta,intb,intc);
void GetSum();
private:
int a,b,c;
static int Sum;//聲明靜態數據成員
};
intMyclass::Sum=0;//定義並初始化靜態數據成員
Myclass::Myclass(inta,intb,intc)
{
this->a=a;
this->b=b;
this->c=c;
Sum+=a+b+c;
}
voidMyclass::GetSum()
{
cout<<"Sum="<
特點:不管這個類創建了多少個對象,其靜態成員在內存中只保留一份拷貝,這個拷貝為該類的所有對象共享。也就是說,靜態數據成員是該類的所有對象所共有的。對該類的多個對象來說,靜態數據成員只分配一次內存,供所有對象共 用。所以,靜態數據成員的值對每個對象都是一樣的,它的值可以更新;
靜態數據成員和普通數據成員一樣遵從public,protected,private訪問規則;
靜態成員兩個必不可少的部分:類內聲明、類外初始化
靜態數據成員初始化與一般數據成員初始化不同。靜態數據成員初始化的格式為:
<;數據類型><;類名>::<;靜態數據成員名>=<;值>
類的靜態數據成員有兩種訪問形式:
<;類對象名>.<;靜態數據成員名> 或 <;類類型名>::<;靜態數據成員名>
- 靜態成員函數
class Myclass
{
public :
Myclass(int a,int b,int c);
static void GetSum(); // 聲明靜態成員函數
private : int a, b, c;
static int Sum; //聲明靜態數據成員
}
int Myclass::Sum=0; //定義並初始化靜態數據成員
Myclass::Myclass(int a,int b,int c)
{
this->a = a;
this->b = b;
this->c = c;
Sum += a + b + c; //非靜態成員函數可以訪問靜態數據成員
}
void Myclass::GetSum() //靜態成員函數的實現
{
// cout<
靜態成員函數可以在類內定義。也可以在類內聲明,類外定義。當在類外定義時,不能再使用static關鍵字作為前綴
調用方法
-1 類名::靜態成員函數
如上所示
Myclass::GetSum();
-2 對象.靜態成員函數
如上所示
M.GetSum();
通過對象調用靜態成員函數需要注意:
1、通過對象訪問靜態成員函數的前提條件為對象已經簡歷
2、靜態成員函數的訪問權限同普通成員函數一樣
3、靜態成員函數也可以省略參數、使用默認形參值、以及進行重載。
靜態成員函數與普通成、成員函數在使用上的區別:由於靜態成員函數在類中只有一個拷貝,因此他訪問對象的成員要收到一些閒置:靜態成員函數可以直接訪問類中說明的靜態成員,但不能直接訪問類中的非靜態成員;如果要訪問非靜態成員,必須通過參數傳遞的方式得到相應的對象,再通過對象來訪問。還需要注意的是:由於靜態成員是獨立於對象存在,因此靜態成員沒有this指針。