範圍:在一個函數內部定義的變量,做用範圍只限於本函數體內。ios
生存期:程序執行到本函數纔會給局部變量分配內存單元,函數執行完畢局部變量所佔的存儲單元就被釋放函數
範圍:函數體內,離開函數體就不起做用,可是值仍然被保留,下次被調用的時候使用的是上次的值spa
生存期:在編譯階段賦值,從程序運行開始就被分配固定的存儲單元(靜態存儲區),整個程序運行期間再也不從新分配,生存週期是整個程序運行期間code
#include<iostream> using namespace std; int calltimes(){ static int i=0; i++; cout<<"The function has been called "<< i <<" times!" <<endl; } int main(){ calltimes(); calltimes(); calltimes(); calltimes(); system("pause"); return 0; }
輸出
內存
The function has been called 1 times!作用域
The function has been called 2 times!io
The function has been called 3 times!編譯
The function has been called 4 times!function
在函數體外部定義的變量是全局變量,能夠被本文件全部其餘函數訪問使用。class
做用域:全部文件。在一個cpp定義的全局變量在另外一個cpp中使用,應該在使用它的函數體內部或外部進行extern說明
生存期:全局變量在程序的所有執行過程當中佔用固定的內存單元,生存週期是整個程序運行期間。
做用域:定義它的cpp文件,而不是程序中的全部cpp文件
生存期:整個程序運行期間
不一樣cpp文件能夠使用相同名稱的靜態全局變量名互不干擾
variable.cpp
static int i=10; int j=100;
main.cpp
#include <cstdlib> #include <iostream> #include "test.h" using namespace std; //extern int i; //因爲在variable.cpp中i是靜態成員,因此即便加了extern聲明也不能訪問到,編譯不成功 extern int j;//只有加extern聲明才能訪問到variable.cpp中的全局變量j int main(int argc, char *argv[]) { // cout<<i<<endl; cout<<j<<endl; system("PAUSE"); return EXIT_SUCCESS; }
輸出:
100
靜態函數只能被所在的cpp文件調用,不一樣cpp文件能夠有相同的靜態函數名字。
調用方式有兩種
第一引入函數所在頭文件,第二在調用函數前進行extern聲明
test.h
#include<iostream> using namespace std; int sum1(int,int); static int sum2(int, int); int sum3(int,int);
test.cpp
#include "test.h" int sum1(int x, int y){ cout<<"sum 1 calculating ...."<<endl; return x+y; } static int sum2(int x, int y){ cout<<"static sum 2 calculating ...."<<endl; return x+y; } int sum3(int x, int y){ cout<<"sum 3 calculating ...."<<endl; return sum2(x,y); }
main.cpp
#include <cstdlib> #include <iostream> #include "test.h" using namespace std; int main(int argc, char *argv[]) { //extern int sum1(int,int);//若是不加test.h頭文件引用,進行extern聲明一樣能夠調用sum1 cout<<sum1(1,2)<<endl; //cout<<sum2(1,2)<<endl; //sum2是靜態函數,不能調用 cout<<sum3(1,2)<<endl; // sum3與sum2在同一個cpp文件中,sum3能夠調用sum2 system("PAUSE"); return EXIT_SUCCESS; }