1. 程式人生 > >C++變數的儲存類別與作用域

C++變數的儲存類別與作用域

總結一下C++中變數的儲存類別以及變數的作用域

(1)標示符的儲存類別決定了標示符在記憶體中存在的時間(我們可以理解標示符就是確定一個變數的符號,也就是我們所說的變數名)

二:儲存類別

(1)靜態儲存類別:靜態存數類別變數(我們簡稱靜態變數),從程式的開始處就存在,其生命期伴隨整個程式。

(2)自動儲存類別:當變數時自動儲存類別時,變數在進入到定義它們的程式快時定義它,在離開它們所在的程式塊(作用域)時銷燬它,因此成為自動變數。其中關鍵字auto和register用來宣告自動型別的變數,

三:自動儲存型別

(1) 只有在函式中的區域性變數才是自動儲存型別的,我們在MAIN函式中定義的變數一般都是自動變數,關鍵字auto可以不寫,預設情況區域性變數就是自動變數(我們把自動儲存類別的變數叫自動變數)如下圖:

 int a;

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;
}




相關推薦

C++變數儲存類別作用

總結一下C++中變數的儲存類別以及變數的作用域。 (1)標示符的儲存類別決定了標示符在記憶體中存在的時間(我們可以理解標示符就是確定一個變數的符號,也就是我們所說的變數名) 二:儲存類別 (1)靜態儲存類別:靜態存數類別變數(我們簡稱靜態變數),從程式的開始處就存在,其

儲存型別作用

一個變數,不僅有資料型別,還有儲存型別。 資料型別包括整形、長整形、單精度浮點型、雙精度浮點型、各種字元型、指標型、結構型和自定義型別等。 儲存型別:分為靜態儲存和動態儲存兩大類。 動態儲存:包括自動變數(auto)和暫存器變數(register); 靜態儲存:包括靜

全域性初始化變數/全域性未初始化變數/全域性靜態變數/區域性變數儲存位置,作用生命週期

比如如下程式程式碼片段 int a = 0; char *p1; static int x = 10; int main(void) { int b = 0; char

C語言常量以及變數型別,儲存型別和作用

變數 其值可以改變的量稱為變數。一個變數應該有一個名字,在記憶體中佔據一定的儲存單元。變數定義必須放在變數使用之前。一般放在函式體的開頭部分。要區分變數名和變數值是兩個不同的概念。 變數定義的一般形式為:    型別說明符  變數名, 變數名, ...;在書寫變數定義時,應注意以下幾點: 允許在一個型

C語言中關鍵詞static的用法作用

細心 錯誤 不同 color 運行程序 可能 gpo 需要 之間 一、面向過程設計中的static 轉載:http://blog.csdn.net/celerylxq/article/details/6160499 1、靜態全局變量 在全局變量前,加上關鍵字stati

C語言高階篇 - 3.儲存類&作用&生命週期&連結屬性

1.概念解析 1.1、儲存類         (1)儲存類就是儲存型別,也就是描述C語言變數在何種地方儲存。         (2)記憶體有多種管理方法:棧、堆、資料段、bss段、.text段······一個

javascript中的變數作用

在說變數作用域之前先了解以下幾個概念 塊級作用域:在其他語言中,任何一對花括號內的語句都屬於一個塊,在這個塊中定義的所有變數在程式碼外部都是不可見的,但是在js中,外部可以訪問 { var age=12; } console.log(age); //控

c語言的變數,常量及作用

1.const定義常量 在C語言中,const可以用來定義的一個常量,在變數名前加上const即可。 int const a; 定義了一個a的整數常量,且a的值不能被修改。如果要修改a的值,有以下兩種方法。 方法一 int const a=100; 在定義時,就對它進行初始化 方法二 在函式中

C/C++中的變數儲存類別以及記憶體分配

本文也是總結了網上一些大神們的部落格(寫得太牛逼了),然後結合自己看書的一些內容。參考:                   http://hi.baidu.com/lcplj123/item/e984cd0f921e39c12e4c6baa http://www.eefo

C++ 指標作用

C/C++中的指標操作是一個令人抓狂的問題,這幾天在溫習林銳的《高質量C++C程式設計指南》,裡面的記憶體管理這一章對我受益匪淺。看到下面的一段內容,不禁和作者提出相同的疑問:該程式不出錯是因為編譯器的原因嗎?並在網上查詢相關資料。 原始碼1: #include <

變數宣告和定義的區別||變數儲存類別小結(C程式設計中的內容)

我們在程式設計中,時時刻刻都用到變數的定義和變數的宣告,可有些時候我們對這個概念不是很清楚,知道它是怎麼用,但卻不知是怎麼一會事,下面我就簡單的把他們的區別介紹如下: 變數的宣告有兩種情況:

程式碼塊中的區域性變數作用

大多數過程型語言都有作用域(scope)的概念。作用域決定了在其內定義的變數名的可見性和生命週期。在C、C++和Java中,作用去由花括號的位置決定。例如: { int x = 12; //only x available {

關於C語言變數生存週期、作用、記憶體分佈、預設值的基本總結

在C語言中,參與計算的資料都是通過不同型別的常量或者變數來表示的,而使用變數時不得不注意變數的生存週期、作用域,記憶體區域和預設值。在這裡簡單介紹一下記憶體區域: 程式碼段(code segment)

11、函數對象、函數的嵌套、名稱空間作用

() update 啟動 nbsp money 有效 產生 strip() return 一、函數對象   函數對象,函數是第一類對象,即函數可以當做數據傳遞   具體特點:     1、可以被引用;   1 def foo(): 2 print(‘from fo

名稱空間作用

引用 efi 執行 error: 有效 域名 內部 內部函數 沒有 一、名稱空間 名稱空間分三種: 內置名稱空間 Python解釋器自帶的名字,Python解釋器啟動就會生成內置名稱空間 全局名稱空間 文件級別定義的名字(頂頭寫,無縮進),都會存放在全局名稱空間,

Python__名稱空間作用

pytho foo 自帶 glob from 解釋器 變量 bar 如果 一:函數嵌套,在調用一個函數的過程中,又調用了其他函數 def bar(): print(‘from bar‘)def foo(): print(‘from foo‘) bar()f

js的作用作用

性能 使用 plain 賦值 function keyword ack 全局變量 pla JavaScript的作用域和作用域鏈。在初學JavaScript時,覺得它就和其他語言沒啥區別,尤其是作用域這塊,想當然的以為“全局變量就是在整個程序的任何地方都可以訪問,也就是寫在

第四章:執行環境作用

logs 執行 引用傳遞 按值傳遞 ons fun col func clas 函數中對象的值是按值傳遞的 !(function () { //對象的按值傳遞or按引用傳遞在函數中 function setName(obj) {

python-之名稱空間作用、閉包函數、嵌套函數

文件的 執行文件 全局 brush 名字查找 在哪裏 位置 opened tin 一、名稱空間與作用域 名稱空間:存放名字的地方,準確的說名稱空間是存放名字與變量值綁定關系的地方 內置名稱空間:在python解釋器啟動時產生,存放一些python內置的名字

函數對象、函數嵌套、名稱空間作用、裝飾器

choice strong .get make wrap strip 內置模塊 正是 rand 一 函數對象 一 函數是第一類對象,即函數可以當作數據傳遞 #1 可以被引用 #2 可以當作參數傳遞 #3 返回值可以是函數 #3 可以當作容器類型的元素