1. 程式人生 > >C++ 作用域運算子

C++ 作用域運算子

C++使用::運算子搞定很多東西,其中最基本的一個用處就是用來決議多繼承中的重名成員。::運算子的本質是:左運算元是一個scope,右運算元是這個scope內的名字,可以是 scope,class,member或者function,variable等等,從左運算元指定的scope中找到有運算元這個實體。看起來非常優雅,不是麼?可是,它有好幾個缺陷。一、現實的常見的缺陷。分散在程式碼中,一旦改變會引起很多地方同時都需要改。其實這就是決策不能集中作出的一個典型現象。二、理論上的缺陷一。它喪失了虛擬性也就是多型性。這個問題說小也小說大也大,如果你就想靜態呼叫,那麼ok,非常好。如果我們需要多型性,那麼對不起,不可能了。但是對於虛擬函式,我們一般期待的多型性。三、理論上的缺陷二。它主要體現在using語句中,我們知道,using可以引入一個名字,一個別的scope(主要是名稱空間)中的名字,當然,也可以在子類中引用父類的名字以改變訪問級別。這個行為的一個缺陷是引入了所有overload的名字,你不能引入部分實體。這在實踐中一般沒有問題,但是,一旦有了問題就非常難繞開。

 ::是C++裡的“作用域運算子”。
比如聲明瞭一個類A,類A裡聲明瞭一個成員函式void f(),但沒有在類的聲明裡給出f的定義,那麼在類外定義f時,就要寫成void A::f(),表示這個f()函式是類A的成員函式。
   :: 一般還有一種用法,就是直接用在全域性函式前,表示是全域性函式。當類的成員函式跟類外的一個全域性函式同名時,在類內定義的時候,打此函式名預設 呼叫的是本身的成員函式;如果要呼叫同名的全域性函式時,就必須打上::以示區別。比如在VC裡,你可以在呼叫API函式時,在API函式名前加::。
 
如果有兩個同名變數,一個是全域性的,一個是區域性的,那麼區域性的變數在其作用域擁有較高的優先權,全域性變數則被遮蔽。
    那如果我希望在區域性變數的作用域裡使用全域性變數怎麼辦,這時就要用到::作用域運算子了。比如: 
複製程式碼
1 #include<iostream>

3  usingnamespace std;

5  int x;

7  int main()

9 {
10 
11   int x;
12 
13   x=50;
14 
15   ::x=100;
16 
17   cout<<"區域性變數x="<<x<<endl;
18 
19   cout<<"全域性變數x="<<::x<<endl;
20 
21   return0;
22 

23 }