c++中.和-,波浪号~符号怎么⽤————很重要
1、⽤在类中的析构函数之前,表⽰该函数是析构函数。如类A的析构函数
class A
{
//... ~A(){}//析构函数
};
2、⽤于数字或者整形变量之前,表⽰对该数取反操作,其规则是~0=1, ~1=0, 如⼆进制0101 0101取反后就是1010 1010
C++之类的析构函数
简单说说类的析构函数,它是类的⼀个成员函数,名字由波浪号加类名构成。看它的名字我们⼤概就能联想到他功能,是执⾏与构造函数相反的操作:释放对象使⽤的资源,并销毁⾮static成员。
同样的,我们来看看析构函数的⼏个特点:
1.函数名是在类名前加上~,⽆参数且⽆返回值。
2.⼀个类只能有且有⼀个析构函数,如果没有显式的定义,系统会⽣成⼀个缺省的析构函数(合成析构函数)。
3.析构函数不能重载。每有⼀次构造函数的调⽤就会有⼀次析构函数的调⽤。
c++中 . 和 -> 的区别是什么?
主要⽤于访问类的成员,->主要⽤于类类型的指针访问类的成员,⽽. 运算符,主要⽤于类类型的对象访问类的成员。
举例
class A{public :int a}A ma;A *p=&ma;
那么指针p应使⽤->来访问成员a,⽐如p->a,⽽ma应使⽤.来访问,⽐如ma.a区别就在这⾥,凡是指针就使⽤->,对象就使⽤.运算符。
c++中||和&&是什么意思?||是逻辑或只要有⼀个为真即为真值;&&是逻辑与只要有⼀个不为真就不是真值;
如果你学过pascal ||为or &&为 and
c++中冒号(:)和双冒号(::)的⽤法
1.冒号(:)⽤法
(1)表⽰机构内位域的定义(即该变量占⼏个bit空间)
typedef struct _XXX{ unsigned char a:4; unsigned char c; } ; XXX
(2)构造函数后⾯的冒号起分割作⽤,是类给成员变量赋值的⽅法,初始化列表,更适⽤于成员变量的常量const型。 struct _XXX{switch函数用法举例
_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 << 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后。这个不说了,要是不会的话,我也没话可说了。
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的成员函数。例如
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。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论