總結一下C++中變量的存儲類別以及變量的做用域。ios
(1)標示符的存儲類別決定了標示符在內存中存在的時間(咱們能夠理解標示符就是肯定一個變量的符號,也就是咱們所說的變量名)程序員
二:存儲類別函數
(1)靜態存儲類別:靜態存數類別變量(咱們簡稱靜態變量),從程序的開始處就存在,其生命期伴隨整個程序。spa
(2)自動存儲類別:當變量時自動存儲類別時,變量在進入到定義它們的程序快時定義它,在離開它們所在的程序塊(做用域)時銷燬它,所以成爲自動變量。其中關鍵字auto和register用來聲明自動類型的變量,設計
三:自動存儲類型:code
(1) 只有在函數中的局部變量纔是自動存儲類型的,咱們在MAIN函數中定義的變量通常都是自動變量,關鍵字auto能夠不寫,默認狀況局部變量就是自動變量(咱們把自動存儲類別的變量叫自動變量)以下圖:blog
int a;ip
int b; 內存
都是自動變量作用域
(2)自動變量還有一種寄存器變量,既使用關鍵字register,咱們把常常被調用的變量聲明爲寄存器變量,顧名思義,讓變量存在於寄存器中,達到更加快速的存儲,這個咱們瞭解便可,如今不少編譯器帶有能夠識別頻繁使用變量的功能,不須要程序員手動設置。
根據最小特權原則,咱們應該定義自動變量。代碼應該只被賦予它僅能完成設計任務的權限,無需更多權限。
四:靜態存儲類別
(1)關鍵字extern和static用於靜態存儲類別的變量,靜態存數類別變量(咱們簡稱靜態變量),從程序的開始處就存在,其生命期伴隨整個程序,一直存在程序的執行過程,可是:即使是靜態變量,也並不意味着這些變量(專業來講叫:標識符),在整個程序都是能用的(或者說是能夠訪問的),這一點在下面有專門的實例。
(2)對於靜態變量,許多被誤認爲和全局變量一致,這一點是錯誤的,static變量僅僅在變量的做用範圍內可見,而全局變量是在全部地方均可見的,這就是static變量與全局變量的區別,咱們要糾正一點:存儲類別(存數類型)和變量的做用域是兩個獨立的問題。
咱們應該遵循最小特權原則,不去使用全局變量。
(3)咱們解釋一下,全局變量和靜態變量的區別:全局變量是不顯示用static修飾的全局變量,但全局變量默認是靜態的,做用域是整個工程,在一個文件內定義的全局變量,在另外一個文件中,經過extern 全局變量名的聲明,就可使用全局變量。
全局靜態變量是顯示用static修飾的全局變量,做用域是所在的文件,其餘的文件即便用extern聲明也不能使用。
五:標識符(變量)的做用域
(1) 程序中可使用標識符的範圍成爲標識符 的做用域,其中咱們稱標識符爲變量,更加專業。例如:咱們在一個語句塊中聲明瞭一個局部的變量,那麼只能在該語句塊中使用該變量。
(2)其中做用域大體分爲四個:
l 全局做用域:此變量對於從其聲明處到文件結束,都是已知的。
l 局部做用域:一個語句塊中聲明的變量,其做用域在於該語句塊中。
l 函數原型做用域:就是函數的形參列表中。
這裏着重標記一下局部做用域:當語句塊是嵌套的,而且外層語句塊中的一個標識符和內層語句塊中的標識符名字一致時,外層語句塊中的標識符被隱藏,直到內層語句塊結束。
六 注意:
(1)咱們應該避免使用全局變量,使用全局變量可能在不須要訪問變量時卻錯誤的訪問變量,違反最小特權原則。僅用於特定函數中的變量應該聲明爲那個函數的局部變量,而不是全局變量。
(2)應該避免使用會隱藏在外部做用域中名稱的變量名,這能夠經過在程序中避免使用相同的標識符。
上述總結說明了變量的類型以及做用域,此時咱們舉個程序,列舉上述出現的狀況。以下:
#include<iostream> using namespace std; void use_Global(); //聲明函數 void use_Local(); void use_Static_Local(); int a=1; //在函數外定義一個全局的變量 int main() { cout<<"the value of global a in the main function is "<<a<<endl; //<span style="color:#ff0000;">輸出全局變量的值,值爲 1</span> int a=10; //在MAIN函數中定義一個同名字的局部變量 cout<<"now ,in the main function , local a is "<<a<<endl; //<span style="color:#ff0000;">輸出局部變量,此時全局變量被隱藏,此時的輸出的值爲 10</span> { //在語句塊中定義局部變量 int a=7; cout<<"int the scope ,local a is "<<a<<endl; //<span style="color:#ff0000;">輸出值爲:7</span> } cout<<"local a in the main's outer scope is"<<a<<endl; //<span style="color:#ff0000;">脫離語句塊,輸出變量,輸出值爲:10</span> use_Local(); //使用函數,函數中定義一個局部變量 use_Static_Local(); //使用函數,函數中定義一個靜態局部變量 use_Global(); //使用函數,函數中使用全局變量 use_Local(); use_Static_Local(); use_Global(); return 0; } void use_Global() { cout<<"\n global a is "<<a<<endl;//<span style="color:#ff0000;">此做用域中,沒有定義同名的標識符,因此輸出的全局變量,值爲10</span> cout<<"enter the use_Global function "<<endl; a++; cout<<"\n global a is "<<a<<" on the exit "<<endl; } void use_Local() { int a=20; cout<<"enter the function use_Local, the a is "<<a<<endl; a++;; cout<<"exit the function use_Local, the a is "<<a<<endl; } void use_Static_Local() { static int a=5; //定義靜態變量,函數調用結束後,仍存在,可是僅在此函數中能夠調用,脫離此做用域,就不行。 cout<<"enter the function use_Static_Local, the a is "<<a<<endl; a++;; cout<<"exit the function use_Static_Local, the a is "<<a<<endl; }