標(biāo)識(shí)符的作用域有函數(shù)原型作用域、局部作用域(塊作用域)赘方、類作用域和 命名空間(namespace) 作用域
函數(shù)原型作用域
函數(shù)原型作用域 函數(shù)原型作用域 是C++ 程序中最小的作用域——函數(shù)原型的聲明中一定要包含形參的名稱和類型說(shuō)明快集。實(shí)際上現(xiàn)在大家應(yīng)該也能夠感受得到每瞒, 在函數(shù)原型聲明時(shí)形式參數(shù)的作用范圍就是函數(shù)原型作用域 孤澎。
對(duì)于Clock類中的成員函數(shù):
1void setTime(int newS,int newM,int newH){
2//函數(shù)體
3
}
newS
, newM
,newH
這三個(gè)標(biāo)識(shí)符——也就是這個(gè)函數(shù)的三個(gè)形參——其作用域僅僅局限于這個(gè)函數(shù)的函數(shù)體,也就是說(shuō)大括號(hào)范圍之內(nèi)条摸,在程序的任何其他地方都不能引用這個(gè)標(biāo)識(shí)符——所以它們的作用域被稱為函數(shù)原型作用域
局部作用域(塊作用域)
局部作用域這里的 局部作用域 主要指的是同一個(gè)函數(shù)體內(nèi)(可以是主函數(shù)也可以是其他自定義的函數(shù))悦污,使用大括號(hào)分割的不同代碼塊——在我們的日常開(kāi)發(fā)過(guò)程中,較為常見(jiàn)的就是選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的局部作用域屈溉。
這里我們可以舉個(gè)簡(jiǎn)單的例子:
void function(int a){//a的作用域開(kāi)始
int b=a;//b的作用域開(kāi)始
cin >> b;
if (b<0) {//c的作用域開(kāi)始
int c=b+10;
for(int i=0;i<c;i++){//i的作用域開(kāi)始
//循環(huán)體
}//i的作用域結(jié)束
//更多代碼
}//c的作用域結(jié)束
//b的作用域結(jié)束
}//a的作用域結(jié)束
已經(jīng)知道塞关,函數(shù)形參的作用域,從形參列表開(kāi)始子巾,到函數(shù)體結(jié)束之處結(jié)束帆赢。而對(duì)于 函數(shù)體內(nèi)聲明的變量小压,其作用域從聲明處開(kāi)始,一直到聲明所在的塊結(jié)束的大括號(hào)為止 椰于。所謂 塊 怠益,就是被大括號(hào)括起來(lái)的一段程序。比如if后面的分支瘾婿,for后面的循環(huán)體蜻牢,都是程序中的塊——大括號(hào)之間可以相互嵌套,塊與塊之間也存在著包含關(guān)系——一個(gè)變量的作用域偏陪,從自己被聲明處開(kāi)始抢呆,一直到它所在的塊結(jié)束為止——具有局部作用域的變量也叫 局部變量 。
類作用域
- 類作用域類可以被看做是一組有名字的成員的集合——具體地說(shuō)笛谦,某一個(gè)類Class的成員member具有類作用域——對(duì)于member的訪問(wèn)抱虐,有以下幾種方式:
- 如果在class的任意一個(gè)成員函數(shù)中,沒(méi)有聲明同名的局部作用域標(biāo)識(shí)符饥脑,那么這個(gè)成員函數(shù)就可以直接訪問(wèn)成員member恳邀。也就是說(shuō),member在類的成員函數(shù)中都起作用灶轰。
- 通過(guò)表達(dá)式object.member或者Class::member來(lái)訪問(wèn)(其中object是Class的一個(gè)實(shí)例對(duì)象)谣沸,這正是程序中訪問(wèn)對(duì)象成員的最基本方法。其中Class::member的訪問(wèn)方式適用于類的 靜態(tài)成員 笋颤,相關(guān)內(nèi)容將會(huì)在后續(xù)的課程中介紹乳附。
- 通過(guò)ptr->member這樣的表達(dá)式——其中ptr是指向Class的某個(gè)實(shí)例對(duì)象的 指針 。關(guān)于指針的內(nèi)容將在后面的章節(jié)詳細(xì)介紹
命名空間(namespace) 作用域
命名空間的語(yǔ)法組織形式如下:
namespace 命名空間名{
命名空間內(nèi)的各種聲明(函數(shù)聲明伴澄,類聲明等)
}
一個(gè)命名空間自身即確定了一個(gè)作用域许溅,凡是在該命名空間內(nèi)聲明的,不屬于前面提到的各個(gè)作用域的標(biāo)識(shí)符秉版,都屬于這個(gè)命名空間的作用域。在命名空間的內(nèi)部茬祷,可以直接引用當(dāng)前命名空間中聲明的標(biāo)識(shí)符——如果需要引用其他命名空間中的某個(gè)標(biāo)識(shí)符的話清焕,可以使用這樣的語(yǔ)法:
命名空間名::標(biāo)識(shí)符名
namespace NS{
class Class{
//類成員
}
}
NS::Class object;
在標(biāo)識(shí)符前面總是使用這樣的命名空間限定會(huì)顯得過(guò)于冗長(zhǎng)——為此,我們可以使用C++ 中提供的using語(yǔ)句祭犯,形式如下:
using 命名空間名::標(biāo)識(shí)符名;
using namespace 命名空間;
前一種形式將指定的某一個(gè)標(biāo)識(shí)符暴露在當(dāng)前的作用域內(nèi)秸妥,這樣我們就可以直接使用這個(gè)標(biāo)識(shí)符了——而后一種形式則是直接引用整個(gè)命名空間,然后就可以使用這個(gè)命名空間里的所有標(biāo)識(shí)符了沃粗。