[變量命名空間的探討] 命名空間
發(fā)布時(shí)間:2020-02-16 來源: 感恩親情 點(diǎn)擊:
收稿日期:2006-06-30? 作者簡(jiǎn)介:趙海廷(1948-),男,遼寧盤錦人,武漢科技大學(xué)中南分校信息工程學(xué)院教授。? (武漢科技大學(xué)中南分校 信息工程學(xué)院,湖北 武漢 430223)?
摘 要:變量的命名空間是解決在同一作用域內(nèi)同名成員引用問題的方法,本文從介紹C++/VC++系統(tǒng)中變量的生存期、作用域、可見性入手,進(jìn)而討論變量的命名空間,命名空間成員的直接引用、引入命名空間所有成員和命名空間的別名等應(yīng)用問題。?
關(guān)鍵詞:生存期;作用域;可見性;命名空間??
1 變量的生存期及其作用域?
變量的生存期討論的是變量是否存在的問題,而變量的作用域討論的是在變量存在的前提下的有效范圍問題。?
1.1 變量的生存期?
變量的生存期就是變量從創(chuàng)建到消亡的這段時(shí)間。C++/VC++語言的變量的生存期可以分為靜態(tài)生命期和動(dòng)態(tài)生命期。?
如果變量的生存期與系統(tǒng)程序的運(yùn)行期相同,則該變量就具有靜態(tài)的生存期。在所有大括號(hào)對(duì)之外定義的變量具有靜態(tài)生命期。在定義變量時(shí)在數(shù)據(jù)類型之前冠以“static”關(guān)鍵字的外部變量或局部變量也具有靜態(tài)生存期。?
在括大號(hào)對(duì)內(nèi)定義變量的生存期從變量的定義點(diǎn)開始,結(jié)束于定義該變量對(duì)應(yīng)大括號(hào)處,該種變量具有動(dòng)態(tài)的生存期。?
1.2 函數(shù)原型作用域?
在變量的生存期間,每個(gè)變量都有各自的作用域,在各自的作用域內(nèi),該變量可以是可見的,也可以是不可見的。?
C++系統(tǒng)的變量的作用域可以分為:函數(shù)原型作用域,局部作用域,文件作用域、全局作用域和對(duì)象族作用域。?
所謂函數(shù)原型作用域就是在函數(shù)說明時(shí)形式參數(shù)的作用范圍。例如下面函數(shù)說明:
doubleArea(doubleradius);?
其中形參radius的作用范圍就在Area函數(shù)的小括號(hào)對(duì)內(nèi),在程序的其它地方將無法引用該變量,我們說變量radius的作用域就在函數(shù)Area函數(shù)的原型說明中。?
1.3局部作用域?
定義在大括號(hào)內(nèi)的變量一般稱為局部變量,局部變量的作用域從說明變量處開始,一直到塊結(jié)束的大括號(hào)為止。例如以下函數(shù):?
在上述函數(shù)中,函數(shù)fuction的形參a,和本函數(shù)內(nèi)部定義的局部變量b、c的生存期和作用域都是本函數(shù);而變量d的生存期和作用域是從定義點(diǎn)開始,直到包圍它的大括號(hào)的結(jié)束。?
1.4全局作用域和文件作用域?
在大括號(hào)之外定義的變量具有全局的生存期和全局的作用域,這種變量的作用域開始于變量定義點(diǎn),結(jié)束于本文件。若是多文件系統(tǒng),通過extern說明,還可以在其它文件中引用。?
如果一個(gè)全局變量在定義時(shí)其數(shù)據(jù)類型前面冠以“static”關(guān)鍵字,該變量具有全局的生存期和本文件的作用域,也就是該變量只能在定義它的文件中引用。?
1.5對(duì)象族作用域?
在面向?qū)ο蟮腃++系統(tǒng)中,靜態(tài)成員變量要在類內(nèi)進(jìn)行靜態(tài)變量的說明,在類外進(jìn)行靜態(tài)變量的定義。該變量在該類的所有對(duì)象間只有一個(gè)拷貝,為所有對(duì)象共同共享?梢哉J(rèn)為靜態(tài)成員變量對(duì)該類族的所有對(duì)象具有作用域和可見性。例如下面程序:?
上述程序的運(yùn)行結(jié)果說明靜態(tài)成員變量a在各個(gè)對(duì)象間僅有一個(gè)拷貝,其引用的方法可以是“對(duì)象名.變量名”,也可以是“類名::變量名”。?
還有一種說法就是類作用域。所謂的類作用域就是在類內(nèi)定義的數(shù)據(jù)成員,在類的內(nèi)部可以被類的成員函數(shù)訪問;當(dāng)創(chuàng)建該類的對(duì)象時(shí),該類的數(shù)據(jù)成員將被克隆到相應(yīng)的對(duì)象中。?
2變量的可見性和作用域分辨?
可見性是指程序運(yùn)行到某一點(diǎn),能夠被引用的標(biāo)識(shí)符,就說標(biāo)識(shí)符在該處可見。?
2.1不同作用域間的同名覆蓋?
在不同作用域間具有同名的變量,將產(chǎn)生同名覆蓋問題。例如下面程序:?
上述程序的輸出為:789,456,123?
內(nèi)層大括號(hào)對(duì)是內(nèi)層a變量的作用域和可見性范圍,同時(shí)將屏蔽中層和外層的a變量,使其不可見。在程序的控制流程退出內(nèi)層大括號(hào)對(duì)時(shí),內(nèi)層a變量的存儲(chǔ)單元將被釋放。程序控制流程進(jìn)入中層a變量的作用域范圍,中層a變量可見并屏蔽外層a變量。?
2.2派生類中同名成員的分辨?
在類的派生過程中,派生類中若定義了與其父類同名的數(shù)據(jù)成員或成員函數(shù),在派生類對(duì)象下要引用父類的同名成員則需要使用作用域分辨符進(jìn)行分辨。?
派生類對(duì)象引用父類成員的格式為:“派生類對(duì)象名.父類名::成員名”?
例如下面程序:?
上述程序的運(yùn)行結(jié)果為:?
這里是C類的成員函數(shù)!這里是A類的成員函數(shù)!這里是B類的成員函數(shù)!?
上述例子中只給出了成員函數(shù)的引用,對(duì)于同名的數(shù)據(jù)成員也可以如此進(jìn)行引用。
3命名空間?
為了解決同名成員在一個(gè)系統(tǒng)中的引用問題,C++語言在1993年引入了命名空間“Namespace”的概念及其應(yīng)用方法。?
在程序中使用命名空間,首先要將通常使用的I/O包含文件“iostream.h”改為“iostream”;其次還要加入“usingnamespacestd;”語句。?
3.1 命名空間的定義方法?
命名空間定義的格式為:?
namespace命名空間名{……}?
上述大括號(hào)對(duì)內(nèi)就是一個(gè)命名空間。?
3.2 命名空間成員的引用方法?
命名空間內(nèi)成員的引用有三種方法:直接引用命名空間的成員,用using聲明訪問命名空間的成員和引入命名空間的所有成員。?
3.2.1 直接引用命名空間的成員?
直接引用命名空間成員的格式為?
命名空間名::成員名?
例如下面程序:?
3.2.2用using聲明引用命名空間的成員?
引用命名空間成員的第二種方法就是使用using聲明所引用命名空間的成員。使用using將某個(gè)名稱引入特定的作用域,這樣的名稱將不需要作用域限定符限定。如果引用某個(gè)函數(shù)名,則該命名空間的所有同名的函數(shù)都將被引入該作用域。?
使用using聲明訪問命名空間成員的格式為:?using? 命名空間名::成員名?
例如下面程序:?
程序運(yùn)行結(jié)果為:abcd,A,123.456,2?
3.2.3引入命名空間的所有成員?
引用命名空間成員的第三種方法就是引入命名空間的所有成員。將一個(gè)命名空間的所有成員引入某個(gè)作用域,應(yīng)用此種方法引入后不需要具體的作用域分辨。?
變量的生存期表明一個(gè)變量是否存在的問題;變量的作用域則是在變量存在的情況下,該變量可以引用的范圍;變量的可見性則是在變量存在且在作用域內(nèi)能否被引用的問題。一個(gè)變量存在不一定可見,可見的一定存在。?
命名空間是解決在一個(gè)系統(tǒng)中的多個(gè)同名變量的引用問題,三種引用方法可以依情況而定。命名空間的別名則是將一個(gè)較長(zhǎng)的的命名空間名改為一個(gè)較短名字的方法。?
上述討論的是變量的問題,一般也適應(yīng)于對(duì)象。?
參考文獻(xiàn)?
[1]鄭莉,董淵.C++年程序設(shè)計(jì)(2)[M].北京:清華大學(xué)出版社,2002.?
[2]嚴(yán)運(yùn)國,趙海廷.C++程序設(shè)計(jì)基礎(chǔ)[M].北京:科學(xué)出版社,2005.?
[3]趙海廷,嚴(yán)運(yùn)國.C++程序設(shè)計(jì)基礎(chǔ)導(dǎo)學(xué)[M].北京:科學(xué)出版社,2006.?
[4]張莉.C/C++程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2004.?
[5]趙海廷.C語言程序設(shè)計(jì)[M].北京:人民郵電出版社,2005.?
[6]鄭阿奇.Visual C++實(shí)用教程[M].北京:電子工業(yè)出版社,2000.
本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀
相關(guān)熱詞搜索:變量 命名 探討 變量命名空間的探討 變量命名 變量的命名
熱點(diǎn)文章閱讀