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
2 3 usingnamespace std;
4 5 int x;
6 7 int main()
8 9 {
10 11 int x;
12 13 x=50;
14 15 ::x=100;
16 17 cout<<"區域性變數x="<
C 缺陷之作用域運算子
c 使用 運算子搞定很多東西,其中最基本的乙個用處就是用來決議多繼承中的重名成員。運算子的本質是 左運算元是乙個scope,右運算元是這個scope內的名字,可以是scope,class,member或者function,variable等等,從左運算元指定的scope中找到有運算元這個實體。看起來...
C 作用域運算子( )
是c 裡的 作用域運算子 比如宣告了乙個類a,類a裡宣告了乙個成員函式void f 但沒有在類的宣告裡給出f的定義,那麼在類外定義f時,就要寫成void a f 表示這個f 函式是類a的成員函式。一般還有一種用法,就是直接用在全域性函式前,表示是全域性函式。當類的成員函式跟類外的乙個全域性函式同名時...
C 作用域運算子
c 作用域運算子是c 運算子中等級最高的。運算子的本質是 左運算元為域,是乙個scope,右運算元是這個scope中的乙個名字,它可以是乙個scope class member function或者variable等。google style對域作用符的建議和說明可參考 的作用主要包括以下三種 後兩...