简单理解:

  • 学过python的同学这边看
    numpy.random 和 python自带的random,
    如果你直接写个from numpy import *,谁知道你在程序中写的random指的哪个?就会报错。
    C++中这个::的目的就是这样区分一下不同库(C++中称为名称空间)的函数。
  • 没学过python也没关系,这边看
    A公司开发了一个产品A_com 包含print()函数
    B公司开发了一个产品B_com 也包含print()函数
    那你写程序导入后怎么区分用的是哪个print()函数呢?
    A_com::print() 代表A公司产品中的print()函数
    B_com::print() 代表B公司产品中的print()函数
    而 A_com 和 B_com 都称为名称空间

一、:: 是作用域符,是运算符中等级最高的

它分为三种:

  1. global scope(全局作用域符),用法(::name)
    如在程序中的某一处你想调用全局变量a,那么就写成 ::a;(也可以是全局函数)
  2. class scope(类作用域符),用法(class::name)
    如果想调用class A中的成员变量a,那么就写成A::a;
  3. namespace scope(命名空间作用域符),用法(namespace::name)
    他们都是左关联(left-associativity),他们的作用都是为了更明确的调用你想要的变量:
    另外一个如果想调用namespace std中的cout成员,你就写成std::cout(相当于using namespace std;cout)意思是在这里我想用cout对象是命名空间std中的cout(即就是标准库里边的cout);

他们是C++中的基础,如果运用的好的话,程序的出错率也许会降很多

二、

  1. 表示“域操作符”
    例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时, 就要写成void A::f(),表示这个f()函数是类A的成员函数。
#include<iostream>

class A
{
public:
int func(int a, int b);
};
class B : public A
{
public:
int func(int a, int b);
};

int A::func(int a, int b) {
return a + b;
}

int B::func(int a, int b) {
return a * b;
}

int main(){
A obj1;
B obj2;
int a = 3, b = 5;
int res_1 = obj1.func(a, b);
int res_2 = obj2.func(a, b);
std::cout << res_1 << " " << res_2 << std::endl;

return 0;

}

输出

8 15
  1. 直接用在全局函数前,表示是全局函数
    例:在VC里,你可以在调用API 函数里,在API函数名前加 ::
  2. 表示引用成员函数及变量,作用域成员运算符
    例:System::Math::Sqrt() 相当于System.Math.Sqrt();

三、

  1. 作用域符号,此时:: 的前面一般是类名称,后面一般是该类的成员名称。
    C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分。
    如:A,B表示两个类,在A,B中都有成员member。那么
    A::member就表示类A中的成员member,B::member就表示类B中的成员member。
  2. 全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分,如:
#include<iostream>

int data = 100;

int main(){
int data = 99;
std::cout << data << " " << ::data << std::endl;
return 0;
}

输出:

99 100
  1. ::是C++里的“作用域分解运算符”。
    比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。例如
class CA {
public:
int ca_var;
int add(int a, int b);
int add(int a);
};

//那么在实现这个函数时,必须这样书写:
int CA::add(int a, int b)
{
return a + b;
}

//另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:
int CA::add(int a)
{
return a + ::ca_var;
}
//表示当前类实例中的变量ca_var。