花心胡萝卜BLOG花心胡萝卜BLOG

努力,进步,创造价值. YY综合频道:84613536 集学习休闲娱乐于一身的频道!

like

C++中的 双冒号 单冒号 运算符

浏览(150) 评论(2) 分类:C_CPP  作者:花心胡萝卜  发布时间:
分享到:

在C++中,双冒号有这么一下几种作用.

1.作用域符号

 :: 的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分
比如说, A,B表示两个类,在A,B中都有成员member。那么
      A::member就表示类A中的成员member
      B::member就表示类B中的成员member

比如说:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
class myClass
{
public :
    myClass();
// 构造函数,无返回类型,可以有参数列表,这里省去
    ~myClass();// 析构函数
    int a;
    
const int b;
}

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

这里,还出现了冒号运算符.

在这里,冒号运算符的意思是 类构造函数(Constructor)的初始化列表

在构造函数后面紧跟着冒号加初始化列表,各初始化变量之间以逗号(,)隔开.

以上一个例子可以说明.

在多说几句,

1). 初始化列表的作用相当于在构造函数内进行相应成员变量的赋值,但两者是有差别的.

     在初始化列表中是对变量进行初始化,而在构造函数内是进行赋值操作.

      两者的差别在对于像const类型数据的操作上表现得尤为明显.

      我们知道,const类型的变量必须在定义时进行初始化,而不能对const型的变量进行赋值,因此const类型的成员变量只能(而且必须)在初始化列表中进行初始化.

      下面的代码将会出错:

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

2).初始化的顺序与成员变量声名的顺序相同.

先看一下下面的程序:

 C++ Code 
1
2
3
myClass::myClass(): b(1), a(b)
{
}

这样的执行结果a,b各是多少呢?b=1,a=1?

错了,b=1,而a是个随机数.

这一点是相当重要的,一般在初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误.

3).对于继承的类来说,在初始化列表中也可以进行基类的初始化,初始化的顺序是先基类初始化,然后再根据该类自己的变量的声明顺序进行初始化.

关于 单冒号 其他的我就不再多说了,什么三目运算符中的了, 继承用的了, switch中case后的了, public等修饰符后边的了,大家都知道,我就不说了.

2.全局作用域符号

当全局变量在局部函数中与其中某个变量重名,那么就可以用::来区分.

比如说:

 C++ Code 
1
2
3
4
5
6
7
char hxhlb;         // 全局变量
void fuc()
{
    
char hxhlb;     // 局部变量
    hxhlb = hxhlb * hxhlb; // 局部变量 = 局部变量 * 局部变量
    ::hxhlb = ::hxhlb * hxhlb; // 全局变量= 全局变量 * 局部变量
}

在MFC编程中,这种用法还是比较常见的.

3.C++里的“作用域分解运算符”.

比如声明了一个类A,类A里声明了一个成员函数 int f(),但没有在类的声明里给出f的定义.

那么在类外定义f时,就要写成int A::f(),表示这个f()函数是类A的成员函数.

例如:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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. 要和全局变量作用域分开.
}



Tags: C++ 双冒号 :: 单冒号 : 
评论
评论正在努力加载...