C++作用域與函數(shù)重載的實(shí)現(xiàn)
1、作用域
1.1 作用域的作用
作用域——scope
通常來說,一段程序代碼中所用到的名字并不總是有效/可用的,而限定這個(gè)名字的可用性的代碼范圍就是這個(gè)名字的作用域。
簡單來說,作用域的使用減少了代碼中名字的重復(fù)沖突,增強(qiáng)了程序的邏輯性與可靠性
1.2 作用域的分類
C++變量根據(jù)定義位置的不同,具有不同的作用域:
- 全局作用域
- 局部作用域
- 文件作用域
全局變量具有全局作用域
全局變量只需在一個(gè)源文件中定義,就可以作用于所有的源文件
其他不包括全局變量定義的源文件需要用extern關(guān)鍵字再次聲明這個(gè)全局變量
靜態(tài)局部變量具有局部作用域。它只被初始化一次,從第一次初始化直到程序運(yùn)行結(jié)束都一直存在,他和全局變量的區(qū)別在于全局變量對(duì)所有的函數(shù)都是可見的,而靜態(tài)局部變量只對(duì)定義自己的函數(shù)體始終可見
局部變量也只有局部作用域,他是自動(dòng)對(duì)象,他在程序運(yùn)行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用結(jié)束后,變量就被撤銷,其所占用的內(nèi)存也被收回
靜態(tài)全局變量也具有全局作用域,他與全局變量的區(qū)別在于如果程序包含多個(gè)文件的話,他作用于定義它的文件里,不能作用到其他文件里,即被static關(guān)
鍵字修飾過的變量具有文件作用域。這樣即使兩個(gè)不同的源文件都定義了相同的靜態(tài)全局變量,也是不同的變量
1.3 static 、const
1.3.1 static
靜態(tài)函數(shù)只能被所在的cpp文件調(diào)用,不同cpp文件可以有相同的靜態(tài)函數(shù)名字。靜態(tài)函數(shù)與普通函數(shù)作用域不同,僅在本文件。內(nèi)部函數(shù):只在當(dāng)前源文件中聲明和定義的函數(shù)稱為內(nèi)部函數(shù)(static);對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在頭文件中說明,或者進(jìn)行extern全局聲明。static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝
static作用于局部變量時(shí)
在局部變量聲明前加static = 靜態(tài)局部變量,存儲(chǔ)方式改變了,局部變量是動(dòng)態(tài)存儲(chǔ),靜態(tài)局部變量是靜態(tài)存儲(chǔ)方式,也就是改變了它的生存期由函數(shù)內(nèi)部或者塊內(nèi)部變?yōu)槲募饔糜?,雖然并不是真正的“文件作用域”,聲明在函數(shù)內(nèi),但是在函數(shù)外部無法訪問,只是為了避免重名沖突
static作用于全局變量時(shí)
在全局變量聲明前加static = static全局變量,全局變量本身是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量也是靜態(tài)存儲(chǔ)方式,在存儲(chǔ)方式上無區(qū)別,無改變,主要區(qū)別在于非靜態(tài)全局變量的作用于是整個(gè)源程序(由多個(gè)源程序組成的話,在各個(gè)源文件中都有效);靜態(tài)全局變量限制了作用域,只在定義該變量的源文件中有效(全局作用域->文件作用域),可避免在其他文件中引起錯(cuò)誤,static變量只初始化一次,下一次依照上一次的值。
總結(jié):
靜態(tài)局部變量擴(kuò)大了局部變量的生存期,靜態(tài)全局變量縮小了全局變量的作用域
1.3.2 const
const在C語言和C++中存在差異,先來解釋其中的區(qū)別
在C語言中,Const修飾的變量只是告訴編譯器該變量是一個(gè)只讀的變量,不能通過該變量改寫器內(nèi)存空間中的值,但是其本質(zhì)上還是一個(gè)變量,既然是變量,就會(huì)有內(nèi)存地址,因此可以通過指針間接修改該地址空間的值,舉例如下
在C++中Const修飾的變量被稱為常量,其值存放在常量表中,在使用常量時(shí),編譯器回到常量表中查詢對(duì)應(yīng)的常量,并將其替換,這部分沒有涉及內(nèi)存分配,因此對(duì)其取地址是沒有意義的,但是當(dāng)我們非要對(duì)該常量去地址時(shí),則編譯器會(huì)為其臨時(shí)分配一個(gè)內(nèi)存,并將常量值存入該臨時(shí)內(nèi)存中。事實(shí)上,在C++中規(guī)定必須用const修飾的指針來指向const修飾的常量。雖然可以使用強(qiáng)制轉(zhuǎn)換的方式,對(duì)Const修飾的常量進(jìn)行去地址,并將其賦值給一個(gè)非Const修飾的指針(最好不要這樣做),但打這個(gè)指針上的任何改動(dòng)只會(huì)影響到臨時(shí)分配的內(nèi)存空間,而不會(huì)影響到原常量上
2、 域作用限定符
作用域限定符為兩個(gè)冒號(hào)::,其作用是通知編譯器從作用域限定符左側(cè)名字所示的作用域中尋找右側(cè)名字
即指定訪問指定空間的成員
2.1 空間域的命名
namespace NewSpace { int time = 3600; ... }//命名可嵌套
2.2 指定空間訪問
指定空間 ::操作
實(shí)例:
std :: cout << "" << std :: endl//std::代表訪問標(biāo)準(zhǔn)庫
用全局展開的標(biāo)準(zhǔn)庫就可以避免在cout endl前指定標(biāo)準(zhǔn)庫也是一個(gè)方法,但是對(duì)于可能產(chǎn)生的沖突,我們還是采取指定空間訪問的方法
2.3 全局展開
將某空間在某個(gè)局部或者全局展開,就可以自由使用操作
using namespace ...
2.4 部分展開
部分展開只需要展開我們需要用的操作,比如:
using std :: cout
3、函數(shù)重載
在C語言程序的編寫中,可能會(huì)用到幾個(gè)功能相同的函數(shù),但是有些細(xì)節(jié)卻不同。
例如:交換兩個(gè)數(shù)的值其中包括(int, float,char,double)這些個(gè)類型,我們通常借助不同的命名來完成區(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++中人們提出可以用一個(gè)函數(shù)名定義多個(gè)函數(shù),也就是所謂的函數(shù)重載
3.1 函數(shù)重載規(guī)則
- 函數(shù)名稱必須相同
- 參數(shù)列表必須不同(個(gè)數(shù)不同、類型不同、參數(shù)排列順序不同等)
- 函數(shù)的返回類型可以相同也可以不相同
- 僅僅返回類型不同不足以成為函數(shù)的重載
實(shí)例:
#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; }
到此這篇關(guān)于C++作用域與函數(shù)重載的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++作用域與函數(shù)重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言自定義類型詳解(結(jié)構(gòu)體、枚舉、聯(lián)合體和位段)
這篇文章主要給大家介紹了關(guān)于C語言中結(jié)構(gòu)體、枚舉、聯(lián)合體和位段自定義類型的相關(guān)資料,分別介紹了結(jié)構(gòu)體、枚舉、聯(lián)合體和位段等四種自定義類型,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08使用pthread庫實(shí)現(xiàn)openssl多線程ssl服務(wù)端和客戶端
使用pthread庫實(shí)現(xiàn)openssl多線程ssl服務(wù)端和客戶端,大家參考使用吧2014-01-01C++進(jìn)程間共享數(shù)據(jù)實(shí)例
這篇文章主要介紹了C++進(jìn)程間共享數(shù)據(jù)的方法,是進(jìn)行C++應(yīng)用程序開發(fā)中非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10