c++中冒号(:)和双冒号(::)的区别

1.冒号(:)用法 


(1)表示位域的定义

位域必须是整型数据类型,可以说是uigned或unsigned 。通过在成员名后面接一个冒号以及指定位数的常量表达式,指出成员是一个位域:

typedef unsigned int Bit;
class File
{
  Bit mode:2;
  Bit modefiled:1;
  Bit prot_owner:3;
  Bit prot_group:3;
  Bit prot_world:3;
//..
};
(2)构造函数后面的冒号起分割作用,是类给成员变量初始化的方法,初始化列表,更适用于成员变量的常量const型。 

struct _XXX{ 

_XXX() : y(0xc0) {} 

}; 

(3) public: 、protected:和private:后面的冒号,表示后面定义的所有成员都是公有或保护的或私有的,直到下一个"public:”或"protected"或"private:”出现为止。"private:"为默认处理。 

(4)类名冒号后面的是用来定义类的继承。 

class 派生类名 : 继承方式 基类名 



派生类的成员 

}; 

继承方式:public、private和protected,默认处理是private。 

2.双冒号(::)用法 

(1)用于实现,说明f 在XX作用域中

例如:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f 的定义,那么在类外定义时,

就要写出void A::f(),说明这个f()函数是类A 的成员函数。

(2)在MFC中使用win32 API函数时,在API函数名前加::,用处是指定使用的是全局函数,即win32API函数 ,不使用MFC提供的函数

(3)用于使用,名字查找在指定作用域中查找,不按名字查找的一般方式查找

比如希望在局部变量的作用域内使用同名的全局变量,必须得在该变量前加上::

(4)用于引用类型成员,静态成员函数,静态数据成员

例如:声明了一个System类,Math类为System的嵌套类,是System的public部分。而Sqrt()是Math类的静态成员函数。

使用Sqrt静态成员函数,就应该这样写System::Math::Sqrt();

(5)私有继承的派生类,基类public和protected部分在其派生类中变为private部分,可以使用using声明来恢复访问权限。

template<typename T>
class Counter {
public:
    Counter() { ++count; }
    Counter(const Counter&) { ++count; }
    ~Counter() { --count; }

    static size_t howMany()
    { return count; }

private:
    static size_t count;
};

template<typename T>
size_t
Counter<T>::count = 0; 


class ABCD: private Counter<ABCD> {
public:
    // 使howMany成为公共成员
    using Counter<ABCD>::howMany;

    ..... // ABCD的其它部分没有改变
};

(6)派生类的同名成员函数若隐藏了基类的,你必须为那些原本被遮掩的每个名称引入一个using声明式,否则某些你希望继承的名称会被遮掩.

class Base
    {
    public:
        virtual void mf1() = 0;
        virtual void mf1(int);
        virtual void mf2();
        void mf3();
        void mf3(double);
        ...
    private:
        int x;
    };

class Derived:public Base{
    public:
        //让Base class内名为mf1与mf3的所有东西在
         //Derived作用域内都可见(并且都是public)
        using Base::mf1;
        using Base::mf3;
        virtual void mf1();
        void mf3();
        void mf4();      
    };

你可能感兴趣的:(c++中冒号(:)和双冒号(::)的区别)