visual studio C++冒号:与双冒号::的使用说明

本文详细介绍了C++中冒号和双冒号的多种用法,包括结构体成员定义、构造函数初始化列表、访问控制(public/private)、继承以及作用域分解运算符的应用。冒号用于初始化列表、类访问修饰和继承声明,而双冒号则用于标识成员函数和变量的作用域,特别是在解决同名冲突和类成员初始化时起到关键作用。
摘要由CSDN通过智能技术生成

1. 冒号

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


typedef struct _XXX{
          unsigned char a:4;
          unsigned char c;
} ; XXX

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


struct _XXX{
          _XXX() : y(0xc0) {}
};

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

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

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

class 派生类名 : 继承方式 基类名{    派生类的成员};

2. 双冒号

        ::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。

:: 一般还有一种用法,就是直接用在全局函数前,表示是全局函数。当类的成员函数跟类外的一个全局函数同名时,提示在类内定义的时候,此函数名默认调用的是本身的成员函数;如果要调用同名的全局函数时,就必须打上::以示区别。比如在VC里,你可以在调用API函数时,在API函数名前加::。

(1)作用域符号

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

A::member就表示类A中的成员member 

B::member就表示类B中的成员member

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

        另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:

int CA::add(int a){

    return a + ::ca_var; 
 }  //表示当前类实例中的变量ca_var。

(3)全局作用域符号 

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

char zhou; //全局变量 
void sleep() { 
    char zhou; //局部变量
    char(局部变量) = char(局部变量) *char(局部变量);
    ::char(全局变量) =::char(全局变量) *char(局部变量);
}
    

(4)表示引用成员函数及变量,作用域成员运算符
例:System::Math::Sqrt() 相当于System.Math.Sqrt()

01  class CA {    
02  public:    
03    int ca_var;    
04    int add(int a, int b);    
05    int add(int a);    
06  };   
07      
08  //那么在实现这个函数时,必须这样书写:    
09  int CA::add(int a, int b)    
10  {    
11    return a + b;    
12  }    
13      
14  //另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:    
15  int CA::add(int a)    
16  {    
17    return a + ::ca_var;    
18  }   
19      
20  //表示当前类实例中的变量ca_var。

(5)类构造函数(Constructor)的初始化列表

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值