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 }