c++中冒号(:)和双冒号(::)的用法 您所在的位置:网站首页 名字的号码是什么符号 c++中冒号(:)和双冒号(::)的用法

c++中冒号(:)和双冒号(::)的用法

2024-07-08 02:17| 来源: 网络整理| 查看: 265

转载于:http://fengqing888.blog.163.com/blog/static/3301141620100623933512/

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)类名冒号后面的是用来定义类的继承。class 派生类名 : 继承方式 基类名{ 派生类的成员};继承方式:public、private和protected,默认处理是public。2.双冒号(::)用法(1)表示“域操作符”例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时, 就要写成void A::f(),表示这个f()函数是类A的成员函数。(2)直接用在全局函数前,表示是全局函数 例:在VC里,你可以在调用API 函数里,在API函数名前加::(3)表示引用成员函数及变量,作用域成员运算符例:System::Math::Sqrt() 相当于System.Math.Sqrt()——————————————————————————————————————VC中如下::是C++里的“作用域分解运算符”。比如声明了一个类A,类A里声明了一个成员函数voidf(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成voidA::f(),表示这个f()函数是类A的成员函数。  :: 一般还有一种用法,就是直接用在全局函数前,表示是全局函数。当类的成员函数跟类外的一个全局函数同名时,考试,大提示在类内定义的时候,打此函数名默认调用的是本身的成员函数;如果要调用同名的全局函数时,就必须打上::以示区别。比如在VC里,你可以在调用API函数时,在API函数名前加::。(编辑:)

 

 

 

*********************************************************************************************

*********************************************************************************************

*********************************************************************************************

这篇文章将总结C/C++中的冒号的用法。 1、位域定义这个在前面关于位结构体的文章里说得够多的了,不再重复了。 2、类构造函数(Constructor)的初始化列表 先说下什么叫构造函数吧(是不是啰嗦了?C++的人应该都知道了吧,还是以防万一一下)。所谓构造函数,就是与类同名的函数,它与普通函数的区别在于,它没有返回类型。 在构造函数后面紧跟着冒号加初始化列表,各初始化变量之间以逗号(,)隔开。下面举个例子。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变量不能进行赋值操作;}2)初始化的顺序与成员变量声名的顺序相同。先看一下下面的程序:myClass::myClass():b(1),a(b){} 这样的执行结果a,b各是多少呢?b=1,a=1?不是,b=1而a是个随机数。这一点是相当重要的哦,一般在初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误。 3)对于继承的类来说,在初始化列表中也可以进行基类的初始化,初始化的顺序是先基类初始化,然后再根据该类自己的变量的声明顺序进行初始化。 3、声明基类。假设我们重新定义一个类,继承自myClass类。定义方式如下:class derivedClass : public myClass{// 略去} 这里的冒号起到的就是声名基类的作用,在基类类名前面可以加public/private/protected等标签,用于标识继承的类型,也可以省略,省略的话,用class定义的类默认为private,用struct定义的类默认为public,至于具体各个标签有什么区别这里就不说了。 与初始化列表一样的,这里也可以声名多个基类,各基类之间用逗号(,)隔开。 4、条件语句(? :) 与?构成条件语句,作用相当于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的值。几点说明: 1)?:可以嵌套,但不推荐使用(难懂),下面的表达式你能看懂啥意思不?int max = i>j ? i>k ? i : k : j>k ? j : k;脑袋大了吧,呵呵。 2)?:具有很低的优先级,这个要注意哦,下面的程序执行结果是啥呢?int i = 3;int j = 2;cout j?i:j;// 出错,



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有