单冒号运算符( : )
(1)表示结构体内位域的定义(即该变量占几个bit空间)
如果是相同类型,只要位宽不超过sizeof,就一直是压缩的。超过了就重新分配。
如果是不同类型,一个元素必须在一个字节中。
举例说明:
#include <iostream>
using namespace std;
typedef struct _x{ //如一个字节所剩空间不够存放另一位域时,
char a:1; //应从下一单元起存放该位域
char b:2; //如果剩余空间足够,则放在同一个字节中
char c:1;
}x;
typedef struct _xx{
char a:4; //整个结构体的大小仍然是每个元素的对齐参数的公倍数
char b:5; //每个元素类型和pragma指定的参数的最小值为对齐参数
char c:4;
}xx;
typedef struct _xxx
{
int a:1;
int b:2;
int c:1;
}xxx;
int main()
{
cout<<sizeof(x)<<endl;//1
cout<<sizeof(xx)<<endl;//3
cout<<sizeof(xxx)<<endl;//4
return 0;
}
运行结果:
(2)用在构造函数后表示:初始化列表
初始化顺序与初始化列表中的元素顺序无关,只与类中元素的定义顺序有关。
构造函数初始化时必须采用初始化列表一共有三种情况:
1.需要初始化的数据成员是成员对象
2.需要初始化const修饰的类成员
3.需要初始化引用成员数据
(3)表示类成员的访问权限
“public:” 和”private:”“protected:”后面的冒号,表示后面定义的所有成员都是公有或私有的,直到下一个”public:”或”private:”“protected:”出现为止。在class中默认为”private:”。
(4)类名后面的冒号是用来定义类的继承。
class 派生类名 : 继承方式 基类名
{
派生类的成员
};
继承方式:public、private和protected,默认处理是public。
(5)三目运算符(? :)
具体用法不再赘述
几点说明:
1、?:可以嵌套,但不推荐使用(难懂)。
2、?:具有很低的优先级,这个要注意
举例说明:
int i = 3;
int j = 2;
cout << i>j?i:j;
// 出错,<<比>具有更高的优先级,执行顺序为
//(cout<<i)>j)?i:j,相当于是比较cout<<i与j的大小
//应当为 cout <<(i>j?i:j);
(6)语句标签
通常跟goto配合使用,如:
step1: a = f1();
//....
goto step1;
这种作法也不是很推荐
(7)switch语句中case后会使用冒号。
双冒号运算符( :: )
(1)表示“域操作符”
举例例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时, 就要写成void A::f(),表示这个f()函数是类A的成员函数。
(2)直接用在全局函数前,表示是全局函数
(3)表示引用成员函数及变量,作用域成员运算符,引用命名空间中的成员
例如:System::Math::Sqrt() 相当于System.Math.Sqrt()
例如:std::cout