C++作用域與函數重載的實現
1、作用域
1.1 作用域的作用
作用域——scope
通常來說,一段程序代碼中所用到的名字并不總是有效/可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域。
簡單來說,作用域的使用減少了代碼中名字的重復沖突,增強了程序的邏輯性與可靠性
1.2 作用域的分類
C++變量根據定義位置的不同,具有不同的作用域:
- 全局作用域
- 局部作用域
- 文件作用域
全局變量具有全局作用域
全局變量只需在一個源文件中定義,就可以作用于所有的源文件
其他不包括全局變量定義的源文件需要用extern關鍵字再次聲明這個全局變量
靜態(tài)局部變量具有局部作用域。它只被初始化一次,從第一次初始化直到程序運行結束都一直存在,他和全局變量的區(qū)別在于全局變量對所有的函數都是可見的,而靜態(tài)局部變量只對定義自己的函數體始終可見
局部變量也只有局部作用域,他是自動對象,他在程序運行期間不是一直存在,而是只在函數執(zhí)行期間存在,函數的一次調用結束后,變量就被撤銷,其所占用的內存也被收回
靜態(tài)全局變量也具有全局作用域,他與全局變量的區(qū)別在于如果程序包含多個文件的話,他作用于定義它的文件里,不能作用到其他文件里,即被static關
鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同的靜態(tài)全局變量,也是不同的變量
1.3 static 、const
1.3.1 static
靜態(tài)函數只能被所在的cpp文件調用,不同cpp文件可以有相同的靜態(tài)函數名字。靜態(tài)函數與普通函數作用域不同,僅在本文件。內部函數:只在當前源文件中聲明和定義的函數稱為內部函數(static);對于可在當前源文件以外使用的函數,應該在頭文件中說明,或者進行extern全局聲明。static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
static作用于局部變量時
在局部變量聲明前加static = 靜態(tài)局部變量,存儲方式改變了,局部變量是動態(tài)存儲,靜態(tài)局部變量是靜態(tài)存儲方式,也就是改變了它的生存期由函數內部或者塊內部變?yōu)槲募饔糜?,雖然并不是真正的“文件作用域”,聲明在函數內,但是在函數外部無法訪問,只是為了避免重名沖突
static作用于全局變量時
在全局變量聲明前加static = static全局變量,全局變量本身是靜態(tài)存儲方式,靜態(tài)全局變量也是靜態(tài)存儲方式,在存儲方式上無區(qū)別,無改變,主要區(qū)別在于非靜態(tài)全局變量的作用于是整個源程序(由多個源程序組成的話,在各個源文件中都有效);靜態(tài)全局變量限制了作用域,只在定義該變量的源文件中有效(全局作用域->文件作用域),可避免在其他文件中引起錯誤,static變量只初始化一次,下一次依照上一次的值。
總結:
靜態(tài)局部變量擴大了局部變量的生存期,靜態(tài)全局變量縮小了全局變量的作用域
1.3.2 const
const在C語言和C++中存在差異,先來解釋其中的區(qū)別
在C語言中,Const修飾的變量只是告訴編譯器該變量是一個只讀的變量,不能通過該變量改寫器內存空間中的值,但是其本質上還是一個變量,既然是變量,就會有內存地址,因此可以通過指針間接修改該地址空間的值,舉例如下

在C++中Const修飾的變量被稱為常量,其值存放在常量表中,在使用常量時,編譯器回到常量表中查詢對應的常量,并將其替換,這部分沒有涉及內存分配,因此對其取地址是沒有意義的,但是當我們非要對該常量去地址時,則編譯器會為其臨時分配一個內存,并將常量值存入該臨時內存中。事實上,在C++中規(guī)定必須用const修飾的指針來指向const修飾的常量。雖然可以使用強制轉換的方式,對Const修飾的常量進行去地址,并將其賦值給一個非Const修飾的指針(最好不要這樣做),但打這個指針上的任何改動只會影響到臨時分配的內存空間,而不會影響到原常量上
2、 域作用限定符
作用域限定符為兩個冒號::,其作用是通知編譯器從作用域限定符左側名字所示的作用域中尋找右側名字
即指定訪問指定空間的成員
2.1 空間域的命名
namespace NewSpace
{
int time = 3600;
...
}//命名可嵌套
2.2 指定空間訪問
指定空間 ::操作
實例:
std :: cout << "" << std :: endl//std::代表訪問標準庫
用全局展開的標準庫就可以避免在cout endl前指定標準庫也是一個方法,但是對于可能產生的沖突,我們還是采取指定空間訪問的方法
2.3 全局展開
將某空間在某個局部或者全局展開,就可以自由使用操作
using namespace ...
2.4 部分展開
部分展開只需要展開我們需要用的操作,比如:
using std :: cout
3、函數重載
在C語言程序的編寫中,可能會用到幾個功能相同的函數,但是有些細節(jié)卻不同。
例如:交換兩個數的值其中包括(int, float,char,double)這些個類型,我們通常借助不同的命名來完成區(qū)分
void Swap1(int* a, int* b); void Swap2(float* a, float* b); void Swap3(char* a, char* b); void Swap4(double* a, double* b);
我們可以看出這樣的代碼不美觀而且不便,于是在C++中人們提出可以用一個函數名定義多個函數,也就是所謂的函數重載
3.1 函數重載規(guī)則
- 函數名稱必須相同
- 參數列表必須不同(個數不同、類型不同、參數排列順序不同等)
- 函數的返回類型可以相同也可以不相同
- 僅僅返回類型不同不足以成為函數的重載
實例:
#include<iostream>
using namespace std;
int main()
{
int max(int a, int b, int c);
int max(int a, int b);
int a = 10;
int b = 20;
int c = 30;
cout << max(a, b, c) << endl;
cout << max(a, b) << endl;
return 0;
}
int max(int a, int b, int c)
{
if (b > a)
a = b;
if (c > a)
a = c;
return a;
}
int max(int a, int b)
{
return (a > b) ? a : b;
}到此這篇關于C++作用域與函數重載的實現的文章就介紹到這了,更多相關C++作用域與函數重載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

