单冒号:
用法1:类名冒号后面用来定义类的继承

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();
    enum { IDD = IDD_ABOUTBOX };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);
    protected:
    DECLARE_MESSAGE_MAP()
};

用法2:构造函数后面加冒号用来初始化成员列表
a、对含有对象成员的对象进行初始化,例如,
类line有两个私有对象成员startpoint、endpoint,line的构造函数写成:

 line(int sx,int sy,int ex,int ey):startpoint(sx,sy),endpoint(ex,ey){……}
初始化时按照类定义中对象成员的顺序分别调用各自对象的构造函数,再执行自己的构造函数
b、对于不含对象成员的对象,初始化时也可以套用上面的格式,例如,
类rectangle有两个数据成员length、width,其构造函数写成:
    rectangle():length(1),width(2){}
    rectangle(int x,int y):length(x),width(y){}
c、对父类进行初始化,例如,
CDlgCalcDlg的父类是MFC类CDialog,其构造函数写为:
 CDlgCalcDlg(CWnd* pParent ): CDialog(CDlgCalcDlg::IDD, pParent)
其中IDD是一个枚举元素,标志对话框模板的ID
使用初始化成员列表对对象进行初始化,有时是必须的,有时是出于提高效率的考虑

用法3:表示结构内的位域(该变量占几个bit空间)

typedef struct _XXX{
          unsigned char a:4;//a占4个bit空间
          unsigned char c;
} ; XXX

双冒号::
用法1:局部变量使用同名的全局变量

#include<iostream>
using namespace std;
int intValue=8;
int main()
{
    int intValue=9;
    ::intValue++;
    cout<<::intValue<<endl;
    cout<<intValue<<endl;
    while(1);
}

用法2:在调用API函数时加::
程序内部有和API函数同名的函数
::GetWindowRect(gameh,&r1)
这样写上::就会明确调用外部API中GetWindowRect函数
::在这里表是全局函数,是API里的函数,但是MFC用类封装了这些API,而且函数名和API函数一样。在类里面使用时如果不加::就会被认为是该类里面的相应函数,如果加上::则表示系统的API函数,一般说来系统API函数都要多一个参数。
用法3:域操作符
在类B声明一个函数void fun(),但是没给出具体类的定义,在类外定义是要写成void B::fun()

class B
{
    public:
    void fun();
}
void B::fun()
{
    ...
}

用法4:表示引用成员函数及变量,作用域成员运算符
eg:System::Math::Sqrt() 相当于System.Math.Sqrt()