專題--作用域與可見域
一、作用域
c++作用域可分為5類:函數原型作用域、塊作用域、類作用域、文件作用域和全局(程序)作用域(跨文件)。
1. 函數原型作用域(最小的作用域)
函數原型:int func(int x); 這是一個函數聲明,函數形參x 的作用域就時所謂的函數原型作用域。
2. 塊作用域
一對大括號 { ... } 內的一段程序,塊中聲明的標識符作用域就是塊作用域。
3. 類作用域
類成員的作用域。
4. 文件作用域(static)
全局靜態變量具有全局作用域,從聲明處開始,到文件(.cpp文件)結尾處結束。
5. 全局(程序)作用域(extern)
全局變量具有全局作用域,只要在使用前對其進行聲明(可定義性聲明/引用性聲明),便可在程序(有若干個文件組成)的任意位置使用全局變量。
二、可見域
作用域指的是變量理論上有效的源代碼區域,而可見域指的是該變量實際的內存區域。如果沒有屏蔽發生,可見域和作用域應該是等價的。
只有在可見域內才能對變量進行合法的訪問。
引用聲明不能提供全局可見性(不具備跨文件性質),這意味着,在使用全局變量之前,必須在當前文件或當前塊中進行引用聲明。
內部靜態變量(局部static)的作用域、可見域及屏蔽法則和自動變量一樣,但外部靜態變量需要注意:在一個文件中聲明的外部靜態變量(全局static),將屏蔽其他文件中定義的同名全局變量。但是,不允許在同一個文件中定義同名的全局變量和外部靜態變量。
默認情況下,函數是全局的,可以在不同的文件中共享。和全局變量一樣,使用函數前必須要對其進行聲明(包含有函數聲明的頭文件)。
可使用static關鍵字將函數聲明為文件內部的,這樣,只能在本文件中使用該函數,在函數定義和聲明中都要使用static關鍵字。static函數將屏蔽其他文件中外部定義的同名函數。