The prepended double colon is also known as the scope resolution operator.

C++的作用域运算符是采用两个冒号来表示,即 :: 。其目的在于用来决议多继承中的重名成员。用法有以下几种:

类和类的成员之间(类外定义函数)

比如声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。

  1. #include<iostream>
  2. using namespace std;
  3. class Example {
  4. int num;
  5. public:
  6. Example() {
  7. num = 10;
  8. }
  9. void display();
  10. };
  11. void Example::display() {
  12. cout << "The value of num is: "<<num;;
  13. }
  14. int main() {
  15. Example obj;
  16. obj.display();
  17. return 0;
  18. }


作用域(当本地变量和全局变量拥有相同名字时访问全局变量)

::一般还有一种用法,就是直接用在全局函数前,表示是全局函数。当类的成员函数跟类外的一个全局函数同名时,在类内定义的时候,打此函数名默认调用的是本身的成员函数;如果要调用同名的全局函数时,就必须打上::以示区别。比如在VC里,你可以在调用API函数时,在API函数名前加::。

#include<iostream>
using namespace std;
int num = 7;
int main() {
   int num = 3;
   cout << "Value of local variable num is: " << num;
   cout << "\nValue of global variable num is: " << ::num;
   return 0;
}

//output
Value of local variable num is: 3
Value of global variable num is: 7

面试tips

分类

  1. 全局作用域符(::name):用于类型名称(类、类成员、成员函数、变量等)前,表示作用域为全局命名空间
  2. 类作用域符(class::name):用于表示指定类型的作用域范围是具体某个类的
  3. 命名空间作用域符(namespace::name):用于表示指定类型的作用域范围是具体某个命名空间的
int count = 11;         // 全局(::)的 count

class A {
public:
    static int count;   // 类 A 的 count(A::count)
};
int A::count = 21;

void fun()
{
    int count = 31;     // 初始化局部的 count 为 31
    count = 32;         // 设置局部的 count 的值为 32
}

int main() {
    ::count = 12;       // 测试 1:设置全局的 count 的值为 12

    A::count = 22;      // 测试 2:设置类 A 的 count 为 22

    fun();                // 测试 3

    return 0;
}