1. 標識作用域的級別 2. 標識成員屬於哪個類 3. 限定成員的作用范圍 4. 指出作用域的范圍
作用域符號::的前面一般是類名稱,后面一般是該類的成員名稱,C++為例避免不同的類有名稱相同的成員而采用作用域的方式進行區分
如:A,B表示兩個類,在A,B中都有成員member。那么
A::member就表示類A中的成員member
B::member就表示類B中的成員member
全局作用域符號(雙冒號)例子
#include <stdio.h>
int count = 0; //全局變量 0
void main()
{
int count = 10; //局部變量10
printf("count =%d\n",count);//局部變量屏蔽了全局變量 所以輸出結果是10
{
int count = 20;
printf("count =%d\n",::count); //作用域符號指出引用全局變量0
//::sort
}
}
1. ::域作用符,用來引用全局的變量、函數等
比如
int i = 0;
void test()
{
int i = 3;
cout<<i; //輸出函數中的局部變量i
cout<<::i; //輸出全局變量i
}
比如
int i = 0;
void test()
{
int i = 3;
cout<<i; //輸出函數中的局部變量i
cout<<::i; //輸出全局變量i
}
2. 域作用符,用來引用特定的函數或變量。比如說對類中的全局變量的引用;引用上一作用域對象(變量)。
3. 作用域運算符,指定某個范圍內的成員,比如
class A
{
public:
int bbb();
//可以在類里面定義bbb,當你在類外面定義的時候就要指定他是屬於哪個類的成員函數
};
int A::bbb()
{
cout << "類的外部定義";
}
如果沒有int A::bbb()只是寫了int bbb()的話就會說bbb沒有聲明,會出錯的
class A
{
public:
int bbb();
//可以在類里面定義bbb,當你在類外面定義的時候就要指定他是屬於哪個類的成員函數
};
int A::bbb()
{
cout << "類的外部定義";
}
如果沒有int A::bbb()只是寫了int bbb()的話就會說bbb沒有聲明,會出錯的
4.最重要的一點:名稱是作用域解析運算符"::".
下面讓我們來了解名字空間的含義
名字空間是一種邏輯分組的機制.也就是說,如果有一些聲明按照某種標准在邏輯上屬於同一個集團,就可以將它們放入同一名字空間,以表明這個事實,例如,我定義一個名字空間N 將變量a, b 函數f()放入其中
int a;
namespace N{
int a, b;
void f(){
::a=1; //(被屏蔽的)全局a的限定名
a=10; //非限定名訪問內層a
}
}
void g()
{
a=10; //全局的a
N::a=7; //名字空間N作用域中的a(限定名)
}
位於作用域解析運算符左邊的限定符必須或者是一個名字空間的名字,或者是一個類對象的名字,
這也意味着,局部於某個函數的名字不能通過限定名的方式訪問
第一種,就是區分同名的全局變量(或函數)和局部變量(或函數)。
- #include<iostream>
- using namespace std;
- int sum=0;
- const int N=15;
- int main()
- {
- int n,a[N],sum=0;
- cin>>n;
- for(int i=0;i<n;i++)
- cin>>a[i];
- for(int i=0;i<n;i++)
- {
- if(i%2==0) sum+=a[i];
- ::sum+=a[i];
- }
- cout<<"all="<<::sum<<' '<<"odd="<<sum;
- return 0;
- }
全局變量sum用來求數組的全部和,局部變量sum用來求奇數小標元素的和。
第二種,類的成員函數在類外定義時,指明該函數的作用域為該類。
- #include<iostream>
- using namespace std;
- int calculate(int x)
- {return 2*x*x+4*x+6;}
- class A
- {
- private:
- int a;
- public:
- int calculate();
- A(int m) {a=m;}
- };
- int A::calculate()
- {return 2*a*a+4*a+5;}
- int main()
- {
- A b(5);
- cout<<::calculate(5)<<endl;
- cout<<b.calculate()<<endl;
- return 0;
- }
第三種,命名空間限定,當想輸出某命名空間(如:namespace ns1)中成員的數據時,可以采用命名空間名和作用域限定符::指向該成員數據。
-
<ol start= "1" class="dp-cpp" style="font-family: Consolas, 'Courier New', Courier, mono, serif; line-height: 35px; padding: 0px; border: none; color: rgb(92, 92, 92); margin: 0px 0px 1px 45px !important;"><li class="alt" style="border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(108, 226, 108); list-style: decimal-leading-zero outside; color: inherit; line-height: 18px; margin: 0px !important; padding: 0px 3px 0px 10px !important;">namespace ns1 // 命名空間 ns1
-
{
-
<span style= "white-space:pre"> </span>int a=0;
-
<span style= "white-space:pre"> </span>double b=1;
-
<span style= "white-space:pre"> </span>float tax()
-
<span style= "white-space:pre"> </span>{
-
<span style= "white-space:pre"> </span>return a*b
-
<span style= "white-space:pre"> </span>}
-
<span style= "white-space:pre"> </span>
-
-
-
<span style= "white-space:pre"> </span>namespace ns2 // 嵌套的命名空間 ns2
-
<span style= "white-space:pre"> </span>{
-
<span style= "white-space:pre"> </span>int age;
-
-
-
<span style= "white-space:pre"> </span>}<span style="white-space:pre"> </span>
-
<span style= "white-space:pre"> </span>
-
}
-
-
-
// 如果想輸出命名空間 ns1 中乘員的數據,可以采用下面的方法
-
-
-
cout<<ns1::a<<endl;
-
cout<<ns1::tax()<<endl;
-
cout<<ns1::ns2::age<<endl; // 需要依次指定外層和內層的命名空間名
-