標識符的作用域有函數(shù)原型作用域、局部作用域(塊作用域)、類作用域和 命名空間(namespace) 作用域
函數(shù)原型作用域
函數(shù)原型作用域 函數(shù)原型作用域 是C++ 程序中最小的作用域——函數(shù)原型的聲明中一定要包含形參的名稱和類型說明。實際上現(xiàn)在大家應(yīng)該也能夠感受得到, 在函數(shù)原型聲明時形式參數(shù)的作用范圍就是函數(shù)原型作用域 。
對于Clock類中的成員函數(shù):
1void setTime(int newS,int newM,int newH){
2//函數(shù)體
3
}
newS, newM,newH這三個標識符——也就是這個函數(shù)的三個形參——其作用域僅僅局限于這個函數(shù)的函數(shù)體,也就是說大括號范圍之內(nèi),在程序的任何其他地方都不能引用這個標識符——所以它們的作用域被稱為函數(shù)原型作用域
局部作用域(塊作用域)
局部作用域這里的 局部作用域 主要指的是同一個函數(shù)體內(nèi)(可以是主函數(shù)也可以是其他自定義的函數(shù)),使用大括號分割的不同代碼塊——在我們的日常開發(fā)過程中,較為常見的就是選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的局部作用域。
這里我們可以舉個簡單的例子:
void function(int a){//a的作用域開始
int b=a;//b的作用域開始
cin >> b;
if (b<0) {//c的作用域開始
int c=b+10;
for(int i=0;i<c;i++){//i的作用域開始
//循環(huán)體
}//i的作用域結(jié)束
//更多代碼
}//c的作用域結(jié)束
//b的作用域結(jié)束
}//a的作用域結(jié)束
已經(jīng)知道,函數(shù)形參的作用域,從形參列表開始,到函數(shù)體結(jié)束之處結(jié)束。而對于 函數(shù)體內(nèi)聲明的變量,其作用域從聲明處開始,一直到聲明所在的塊結(jié)束的大括號為止 。所謂 塊 ,就是被大括號括起來的一段程序。比如if后面的分支,for后面的循環(huán)體,都是程序中的塊——大括號之間可以相互嵌套,塊與塊之間也存在著包含關(guān)系——一個變量的作用域,從自己被聲明處開始,一直到它所在的塊結(jié)束為止——具有局部作用域的變量也叫 局部變量 。
類作用域
- 類作用域類可以被看做是一組有名字的成員的集合——具體地說,某一個類Class的成員member具有類作用域——對于member的訪問,有以下幾種方式:
- 如果在class的任意一個成員函數(shù)中,沒有聲明同名的局部作用域標識符,那么這個成員函數(shù)就可以直接訪問成員member。也就是說,member在類的成員函數(shù)中都起作用。
- 通過表達式object.member或者Class::member來訪問(其中object是Class的一個實例對象),這正是程序中訪問對象成員的最基本方法。其中Class::member的訪問方式適用于類的 靜態(tài)成員 ,相關(guān)內(nèi)容將會在后續(xù)的課程中介紹。
- 通過ptr->member這樣的表達式——其中ptr是指向Class的某個實例對象的 指針 。關(guān)于指針的內(nèi)容將在后面的章節(jié)詳細介紹
命名空間(namespace) 作用域
命名空間的語法組織形式如下:
namespace 命名空間名{
命名空間內(nèi)的各種聲明(函數(shù)聲明,類聲明等)
}
一個命名空間自身即確定了一個作用域,凡是在該命名空間內(nèi)聲明的,不屬于前面提到的各個作用域的標識符,都屬于這個命名空間的作用域。在命名空間的內(nèi)部,可以直接引用當前命名空間中聲明的標識符——如果需要引用其他命名空間中的某個標識符的話,可以使用這樣的語法:
命名空間名::標識符名
namespace NS{
class Class{
//類成員
}
}
NS::Class object;
在標識符前面總是使用這樣的命名空間限定會顯得過于冗長——為此,我們可以使用C++ 中提供的using語句,形式如下:
using 命名空間名::標識符名;
using namespace 命名空間;
前一種形式將指定的某一個標識符暴露在當前的作用域內(nèi),這樣我們就可以直接使用這個標識符了——而后一種形式則是直接引用整個命名空間,然后就可以使用這個命名空間里的所有標識符了。