C++ 中 冒号:和双冒号::的简介

冒号(:)的用法

(1)表示机构内位域的定义(即该变量占几个bit空间)

typedef struct _XXX{

unsigned char a:4;

unsigned char c;

} ; XXX

(2)构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。

所谓构造函数,就是与类同名的函数,它与普通函数的区别在于,没有返回类型在构造函数后面紧跟着冒号加初始化列表*,各初始化变量之间以逗号(,)隔开。例如:

class myClass
{
    public :
    myClass();// 构造函数,无返回类型,可以有参数列表,这里省去
    ~myClass();// 析构函数
    int a;
    const int b;
}

myClass::myClass():a(1),b(1)// 初始化列表
{
 ...
}

初始化列表的作用相当于在构造函数内进行相应成员变量的赋值,但两者是有差别的。
    在初始化列表中是对变量进行初始化,而在构造函数内是进行赋值操作。两都的差别在对于像const类型数据的操作上表现得尤为明显。我们知道,const 类型的变量必须在定义时进行初始化,而不能对const型的变量进行赋值,因此const类型的成员变量只能(而且必须)在初始化列表中进行初始化,即下 面的代码将会出错:

myClass::myClass()
{
    a = 1;// 没错,效果相当于在初始化列表中进行初始化
    b = 1;// 出错,const变量不能进行赋值操作;
}

初始化的顺序与成员变量声名的顺序相同。
先看一下下面的程序:

myClass::myClass():b(1),a(b)
{
}

这样的执行结果a,b各是多少呢?b=1,a=1?不是,b=1而a是个随机数。这一点是相当重要,一般在初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误。

 

(3) public:和private:后面的冒号

表示后面定义的所有成员都是公有或私有的,直到下一个"public:”或"private:”出现为止。"private:"为默认处理。



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

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

{

 //派生类的成员

};

这里的冒号起到的就是声名基类的作用,在基类类名前面可以加public/private/protected等标签,用于标识继承的类型,也可以省略, 省略的话,用class定义的类默认为private,用struct定义的类默认为public。
与初始化列表一样的,这里也可以声名多个基类,各基类之间用逗号(,)隔开。

 

(5)条件语句(? :)

与?构成条件语句,作用相当于if else,如下; 

int a,b,c;
a=3;
b=2;
c=a>b?a:b;// 如果a>b成立,则反a赋给c,否则把b赋给c

条件语句的结构为:
条件表达式? 表达式1:表达式2
当条件表达式为true时,表达式的值为表达式1的值,否则为表达式2的值。

 

(6)switch语句中case后

 

双冒号(::)用法

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

2)直接用在全局函数前,表示是全局函数
例:在VC里,你可以在调用API 函数前,在API函数名前加::

3)表示引用成员函数及变量,作用域成员运算符

例:System::Math::Sqrt() 相当于System.Math.Sqrt()

其他例子:

class Test{
public:
    Test();
     static void print() 
    {
        std::cout<<"Test"<<endl; //命名空间时使用::
   }
private:
     int a;
};
Test::Test() : a(1)   //定义时使用::
{}
Test::print();  //使用静态成员函数时用::

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页