C++的':'和'::'ITeye - 娱乐之横扫全球

C++的':'和'::'ITeye

2019-01-14 04:57:03 | 作者: 鸿云 | 标签: 函数,变量,初始化 | 浏览: 3007

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)的初始化列表
所谓结构函数,就是与类同名的函数,它与一般函数的差异在于,它没有回来类型。
在结构函数后边紧跟着冒号加初始化列表,各初始化变量之间以逗号(,)离隔。下面举个比方。
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 i j?i:j;// 犯错, 比 具有更高的优先级,履行次序为 ((cout i) j)?i:j,适当所以比较cout i与j的巨细,然后依据比较成果决议表达式值为i或j,这 明显要犯错的,cout i的值是cout,不能跟整型数j进行比较。
cout (i j)?i:j;//输出1或0,适当于(cout (i j))作为判定条件,来决议表达式的值为i或j,而 cout (i j),i j则输出1不然0,然后再将(cout (i j))作为?:的条件,假如 cout正确履行则为1(true),不然为0(false),以此决议表达式值为i或j
cout (i j?i:j);//i j则输出i,不然输出j,表达式值为true假如cout正确履行,不然为false
更多的关于优先级的问题就不说了。

5、句子标签
一般跟goto合作运用,如:
step1: a = f1();
....
goto step1;
这种作法也不是很引荐,原因在于它破坏了句子的次序履行,这样的价值我们应该清楚吧。不过存在即为合理嘛,已然它还存在,必定仍是有它的用途有它的优点的,比方说,多层嵌套的退出(会比break continue直观一点吧),也能够防止重复代码之类之类的

6、switch句子中case后。
这个不说了,要是不会的话,我也没话可说了。
7、汇编指令模板
能够参阅一下:http://developer.e800.com.cn/articles/2006/43/1144846933898_1.html

 

1、 效果域符号::的前面一般是类称号,后边一般是该类的成员称号,C++为例防止不同的类有称号相同的成员而选用效果域的方法进行区别
如:A,B表明两个类,在A,B中都有成员member。那么
A::member就表明类A中的成员member
B::member就表明类B中的成员member
2、大局效果域符号:当大局变量在部分函数中与其间某个变量重名,那么就能够用::来区别如:
char zhou; //大局变量
void sleep()

char zhou; //部分变量
char(部分变量) = char(部分变量) *char(部分变量) ;
::char(大局变量) =::char(大局变量) *char(部分变量);

3::是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。

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章