一、冒号 “ : ” 的用法
1.1、位域定义
结构体内位域的定义,即该变量占几个bit空间
typedef struct _XXX{
unsigned char a:4; //位域,a只占4 bit
unsigned char c;
}XXX;
1.2、类构造函数的初始化列表
构造函数就是与类同名的函数,它与普通函数的区别在于没有返回类型。在构造函数后面紧跟着冒号加初始化列表,各初始化变量之间以逗号隔开。
构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。
class myClass
{
public :
myClass();// 构造函数,无返回类型,可以有参数列表,这里省去
~myClass();// 析构函数
int a;
const int b;
}
myClass::myClass():a(1),b(1)// 初始化列表
{
}
额外说明:
1)、初始化列表的作用相当于在构造函数内进行相应成员变量的赋值,但两者是有差别的。
在初始化列表中是对变量进行初始化,而在构造函数内是进行赋值操作。两都的差别在对于像const类型数据的操作上表现得尤为明显。因为const类型的变量必须在定义时进行初始化,而不能对其进行赋值,因此const类型的成员变量只能且必须在初始化列表中进行初始化,即下面的代码将会出错:
myClass::myClass()
{
a = 1; // 没错,效果相当于在初始化列表中进行初始化
b = 1; // 出错,const变量不能进行赋值操作;
}
2)、初始化的顺序与成员变量声名的顺序相同。先看下面程序:
myClass::myClass():b(1),a(b)
{
}
这样的执行结果a、b各是多少呢?b=1,a=1?不是,b=1而a是个随机数。这一点相当重要,一般在初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误。
3)、对于继承的类来说,在初始化列表中也可以进行基类的初始化,初始化的顺序是先基类初始化,然后再根据该类自己的变量的声明顺序进行初始化。
1.3、类成员类型
public: 和 private: 后面的冒号,表示后面定义的所有成员都是公有或私有的,直到下一个 "public:” 或 "private:” 出现为止。"private:" 为默认处理。
1.4、类的继承
类名后的冒号是用来定义类的继承。继承方式有:public、private和protected,默认处理是public。
class 派生类名 : 继承方式 基类名
{
派生类的成员
};
1.5、条件语句(? :)
int a,b,c;
a=3;
b=2;
c=a>b?a:b;// 如果a>b成立,则反a赋给c,否则把b赋给c
1.6、语句标签
通常跟goto配合使用。这种方法不推荐,因为它破坏了语句的顺序执行。其包括多层嵌套的退出、避免重复代码等。
step1: a = f1();
....
goto step1;
1.7、switch语句
switch语句中位于case后,指定case对象。
二、双冒号 “ :: ” 用法
2.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。
}
2.2、 全局作用域符号
当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分如:
char zhou; //全局变量
void sleep()
{
char zhou; //局部变量
char(局部变量) = char(局部变量) * char(局部变量) ;
::char(全局变量) =::char(全局变量) * char(局部变量);
}
:: 一般还有一种用法,就是直接用在全局函数前,表示是全局函数。
- 当类的成员函数跟类外的一个全局函数同名时,在类内定义的时候,打此函数名默认调用的是本身的成员函数;
- 如果要调用同名的全局函数时,就必须打上::以示区别。比如在VC里,你可以在调用API函数时,在API函数名前加:: 。