1. 程式人生 > 實用技巧 >C++中的域作用符::的作用

C++中的域作用符::的作用

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
}

2. 域作用符,用來引用特定的函式或變數。比如說對類中的全域性變數的引用;引用上一作用域物件(變數)。

3. 作用域運算子,指定某個範圍內的成員,比如
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(限定名)

}
位於作用域解析運算子左邊的限定符必須或者是一個名字空間的名字,或者是一個類物件的名字,
這也意味著,區域性於某個函式的名字不能通過限定名的方式訪問

第一種,就是區分同名的全域性變數(或函式)和區域性變數(或函式)。

[cpp]view plaincopy
  1. #include<iostream>
  2. usingnamespacestd;
  3. intsum=0;
  4. constintN=15;
  5. intmain()
  6. {
  7. intn,a[N],sum=0;
  8. cin>>n;
  9. for(inti=0;i<n;i++)
  10. cin>>a[i];
  11. for(inti=0;i<n;i++)
  12. {
  13. if(i%2==0)sum+=a[i];
  14. ::sum+=a[i];
  15. }
  16. cout<<"all="<<::sum<<''<<"odd="<<sum;
  17. return0;
  18. }

全域性變數sum用來求陣列的全部和,區域性變數sum用來求奇數小標元素的和。

第二種,類的成員函式在類外定義時,指明該函式的作用域為該類。

[cpp]view plaincopy
  1. #include<iostream>
  2. usingnamespacestd;
  3. intcalculate(intx)
  4. {return2*x*x+4*x+6;}
  5. classA
  6. {
  7. private:
  8. inta;
  9. public:
  10. intcalculate();
  11. A(intm){a=m;}
  12. };
  13. intA::calculate()
  14. {return2*a*a+4*a+5;}
  15. intmain()
  16. {
  17. Ab(5);
  18. cout<<::calculate(5)<<endl;
  19. cout<<b.calculate()<<endl;
  20. return0;
  21. }


第三種,名稱空間限定,當想輸出某名稱空間(如:namespace ns1)中成員的資料時,可以採用名稱空間名和作用域限定符::指向該成員資料。

  1. <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
  2. {
  3. <span style="white-space:pre"> </span>int a=0;
  4. <span style="white-space:pre"> </span>double b=1;
  5. <span style="white-space:pre"> </span>float tax()
  6. <span style="white-space:pre"> </span>{
  7. <span style="white-space:pre"> </span>return a*b
  8. <span style="white-space:pre"> </span>}
  9. <span style="white-space:pre"> </span>
  10. <span style="white-space:pre"> </span>namespace ns2 // 巢狀的名稱空間 ns2
  11. <span style="white-space:pre"> </span>{
  12. <span style="white-space:pre"> </span>int age;
  13. <span style="white-space:pre"> </span>}<span style="white-space:pre"> </span>
  14. <span style="white-space:pre"> </span>
  15. }
  16. // 如果想輸出名稱空間 ns1 中乘員的資料,可以採用下面的方法
  17. cout<<ns1::a<<endl;
  18. cout<<ns1::tax()<<endl;
  19. cout<<ns1::ns2::age<<endl; // 需要依次指定外層和內層的名稱空間名