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