【C++自我精講】基礎系列四 static

【C++自我精講】基礎系列四 static
0 前言

變量的存儲類型:存儲類型按變量的生存期劃分,分動態存儲方式和靜態存儲方式。函數

 1)動態存儲方式的變量,生存期爲變量所在的做用域。即程序運行到此變量時才爲其分配存儲空間,做用域結束時,會自動收回爲其分配的存儲空間。this

 2)靜態存儲方式的變量,生存期爲整個程序執行的過程。即程序開始時就爲其分配存儲空間,程序結束時,纔會收回爲其分配的存儲空間。spa

4種變量的存儲類型:指針

 1)自動類型(auto):動態存儲方式的變量,局部變量,auto經常省略。code

 2)寄存器類型變量(register):動態存儲方式的變量,編譯器不爲此類型變量分配存儲空間,而是直接使用CPU的寄存器。存取速度快,主要用於控制循環次數等不須要長期保存值的變量。對象

 3)外部類型變量(extern):靜態存儲方式的變量,系統自動初始化值,又叫全局變量,全局變量是從做用域提出的,外部變量是從存儲方式提出的,表示了它的生存期。blog

 4)靜態存儲變量(static):靜態存儲方式的變量,系統自動初始化值,靜態變量只能在它的做用範圍內使用。作用域

1 static用法

static:靜態存儲變量的類型說明符。編譯器

static局部變量:在函數內的局部變量類型說明符前加上static說明符就構成靜態局部變量。局部變量變爲靜態局部變量,即改變了它的生存期。it

void Fun()
{
    static int i; //static局部變量
    ...
}

 1)static局部變量在函數內定義。

 2)static局部變量的生存期是整個程序。

 3)static局部變量的做用域爲函數體內。但再次調用定義此函數時,又可繼續使用此變量,並且保存了前次被調用後留下的值。

int Fun1()
{
    int i = 0;    //局部變量
    i++;
    return i;
}
int Fun2()
{
    static int i; //static局部變量
    i++;
    return i;
}
int main(int argc, char* argv[])
{
    int iRet = 0;
    iRet = Fun1();  //iRet = 1;
    iRet = Fun1();  //iRet = 1;
    iRet = Fun2();  //iRet = 1;
    iRet = Fun2();  //iRet = 2;
    return 0;
}

static全局變量:在全局變量類型說明符前加上static就構成靜態的全局變量。全局變量變成靜態全局變量,即改變了它的做用域。

 1)當一個源程序由若干個源文件組成時,在一個源文件中定義的外部變量要在其它的源文件中使用,在使用前就用extern進行外部聲明。

 2)若是在一個源文件中定義的外部變量不想讓其它源文件使用,則必須聲明爲static全局變量,只能供所在的源文件使用。同時能夠避免在其它源文件中引發錯誤。

//全局變量
file1.cpp
int gNum;
main() 
{
    gNum++;
}

file2.cpp
extern int gNum;  
main() 
{
    gNum++;
}

//static全局變量
file3.cpp
static int gNum;  
main() 
{
    gNum++;
}

 static類成員變量:類的全部對象都用同一個static成員變量。經過對象名或類名均可以調用。

class A
{
public:
  static int x;
  int y;
};
 
A a1,a2;   //建立了兩個A的對象
a1.x = 1;  //A::x = 1;或a2.x = 1;同樣,都是對static int x;操做,x = 1;
a1.y = 1;  //a1對象裏面y = 1;
a2.y = 2;  //a2對象裏面y = 2;

 static類成員變量和普通數據成員同樣,不能在類的定義體中初始化,只能在類外進行初始化。但static const卻能夠。

int y = 200;
class A
{
public:
  static const int x = 100;
  static int y;
};

static類成員函數:類的全部對象都用同一個static成員函數。經過對象名或類名均可以調用。

 1)static類成員函數沒有this指針。

 2)static類成員函數不能被聲明爲const和虛函數。

 3)static類成員函數能夠訪問所屬類的static成員變量,但不能使用非static成員變量。

class A
{
public:
  static int x;
  int y;
  static void Fun();  //static成員函數
};
static void Fun()
{
    x++;  //能夠
    y++;  //不能夠
}

A a1;
a1.Fun(); //或A::fun();
相關文章
相關標籤/搜索