C++关键字及其详解
C++关键字
备注:图中是C++98/03中的63个关键字,红⾊标注的是C语⾔的32个关键字。C++11中有73个关键字,新增加的10个分别为:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexpect、nullptr、static_assert、thread_local
下⾯是对部分关键字的解释:
⼀、数据类型相关
1、bool、true、false
bool即为布尔类型,属于基本类型中的整数类型,取值为真和假。true和false是具有布尔类型的字⾯量,为右值,即表⽰真和假。
注:字⾯量:⽤于表达源代码中⼀个固定值的表⽰法。
2、char、wchar_t
表⽰字符型和宽字符型这些整数类型(属于基本类型),但⼀般只专⽤于表⽰字符。char(和signed char、unsigned char⼀起)事实上定义了字节的⼤⼩。char表⽰单字节字符,wchar_t表⽰多字节字符
3、 int、double、float、short、long、signed、unsigned
signed和unsigned作为前缀修饰整数类型,分别表⽰有符号和⽆符号。signed和unsigned修饰char类型,构成unsigned char和signed char,和char都不是相同的类型;不可修饰wchar_t、char16_t和cha
r32_t。其它整数类型的signed省略或不省略,含义不变。signed或unsigned可单独作为类型,相当于signed int和unsigned int。
double和float专⽤于浮点数,double表⽰双精度,精度不⼩于float表⽰的浮点数。long double则是C++11指定的精度不⼩于double的浮点数。
4、explicit
该关键字的作⽤就是避免⾃定义类型隐式转换为类类型。
5、auto
auto关键字会根据初始值⾃动推断变量的数据类型。不是每个编译器都⽀持auto。
例:
auto x = 7; //使⽤整数7对变量x进⾏初始化,可推断x为int型。
auto y=1.234; //使⽤浮点数1.234对变量y进⾏初始化,可推断y为double型。
⼆、语句相关
1、switch、case、default
switch分⽀语句的起始,根据switch条件跳转到case标号或defalut标记的分⽀上。
2、do、for、while
循环语句的组成部分,C和C++都⽀持这3种循环。
3、if和else
条件语句的组成部分。if表⽰条件,之后else表⽰否定分⽀。
4、break、cotinue、goto
break⽤于跳出for、while循环或switch语句。continue⽤于调到⼀个循环的起始位置。goto⽤于⽆条件跳转到函数内得标号处。⼀般情况不建议使⽤goto,风险较⼤。
三、定义、初始化相关
1、const、volatile
const和volatile是类型修饰符,语法类似,⽤于变量或函数参数声明,也可以限制⾮静态成员函数。const表⽰只读类型(指定类型安全性,保护对象不被意外修改),volatile指定被修饰的对象类型的读操作是副作⽤(因此读取不能被随便优化合并,适合映射I/O寄存器等)。
volatile:
a、当读取⼀个变量时,为提⾼存取速度,编译器优化时有时会先把变量读取到⼀个寄存器中,以后再取变量值时,就直接从寄存器中取值。
b、优化器在⽤到volatile变量时必须每次都⼩⼼地重新读取这个变量的值,⽽不是使⽤保存到寄存器⾥的备份。
c、volatile适⽤于多线程应⽤中被⼏个任务共享的变量。
2、enum
构成枚举类型名的关键字。
3、export
使⽤该关键字可实现模板函数的外部调⽤。对模板类型,可以在头⽂件中声明模板类和模板函数;在代码⽂件中,使⽤关键字export来定义具体的模板类对象和模板函数;然后在其他⽤户代码⽂件中,包含声明头⽂件后,就可以使⽤该这些对象和函数。
4、extern
当出现extern “C”时,表⽰ extern “C”之后的代码按照C语⾔的规则去编译;当extern修饰变量或函数时,表⽰其具有外部链接属性,即其既可以在本模块中使⽤也可以在其他模块中使⽤。
5、public、protected、private
这三个都为权限修饰符。public为公有的,访问不受限制;protected为保护的,只能在本类和友元中访问;private为私有的,只能在本类、派⽣类和友元中访问。
6、template
声明⼀个模板,模板函数,模板类等。模板的特化。
7、static
可修饰变量(静态全局变量,静态局部变量),也可以修饰函数和类中的成员函数。static修饰的变量的周期为整个函数的⽣命周期。具有静态⽣存期的变量,只在函数第⼀次调⽤时进⾏初始化,在没有显⽰初始化的情况下,系统把他们初始化微0.
8、struct、class、union
⽤于类型声明。class是⼀般的类类型。struct在C++中是特殊的类类型,声明中仅默认隐式的成员和基类访问限定与class不同(struct 是public,class是private)。union是联合体类型。满⾜特定条件类类型——POD struct或POD union可以和C语⾔中的struct和union 对应兼容。
注:POD类型(Plain Old Data),plain---代表普通类型,old---代表可以与C语⾔兼容。
9、mutable
mutable也是为了突破const的限制⽽设置的。被mutable修饰的变量,将永远处于可变的状态,即使在⼀个const函数中。
10、virtual
声明虚基类,虚函数。虚函数=0时,则为纯虚函数,纯虚函数所在的类称为抽象类。
四、系统操作相关
1、catch、throw、try
⽤于异常处理。try指定try块的起始,try块后的catch可以捕获异常。异常由throw抛出。throw在函数中还表⽰动态异常规范。
网页float是什么意思2、new、delete
new、delete属于操作符,可以被重载。new表⽰向内存申请⼀段新的空间,申请失败会抛出异常。new会先调⽤operator new函数,再在operator new函数⾥调⽤malloc函数分配空间,然后再调构造函数。delete不仅会清理资源,还会释放空间。delete县调⽤析构函数,其次调⽤operator delete函数,最后在operator delete函数⾥⾯调⽤free函数。malloc申请内存失败会返回空。free只是清理了资源,并没有释放空间。
3、friend
友元。使其不受访问权限控制的限制。例如,在1个类中,私有变量外部是不能直接访问的。可是假如另外1个类或函数要访问本类的1个私有变量时,可以把这个函数或类声明为本类的友元函数或友元类。这样他们就可以直接访问本类的私有变量。
4、inline
内联函数,在编译时将所调⽤的函数代码直接嵌⼊到主调函数中。各个编译器的实现⽅式可能不同。
5、operator
和操作符连⽤,指定⼀个重载了的操作符函数,⽐如,operator+。
6、register
提⽰编译器尽可能把变量存⼊到CPU内部寄存器中。
7、typename
typename关键字告诉编译器把⼀个特殊的名字解释为⼀个类型。
五、命名相关
1、using
(1)、在当前⽂件引⼊命名空间,例using namespace std;
(2)、在⼦类中使⽤,using声明引⼊基类成员名称。
2、namespace
C++标准程序库中的所有标识符都被定义于⼀个名为std的namespace中。命名空间除了系统定义的名字空间之外,还可以⾃⼰定义,定义命名空间⽤关键字“namespace”,使⽤命名空间时⽤符号“::”指定。
3、typedef
typedef声明,为现有数据类型创建⼀个新的名字。便于程序的阅读和编写。
六、函数和返回值相关
1、void
特殊的"空"类型,指定函数⽆返回值或⽆参数。
2、return
return表⽰从被调函数返回到主调函数继续执⾏,返回时可附带⼀个返回值,由return后⾯的参数指
定。return通常是必要的,因为函数调⽤的时候计算结果通常是通过返回值带出的。如果函数执⾏不需要返回计算结果,也经常需要返回⼀个状态码来表⽰函数执⾏的顺利与否(-1和0就是最常⽤的状态码),主调函数可以通过返回值判断被调函数的执⾏情况.
3、sizeof
返回类型名或表达式具有的类型对应的⼤⼩。
4、typeid
typeid是⼀个操作符,返回结果为标准库种类型的引⽤。
七、其他
1、this
每个类成员函数都隐含了⼀个this指针,⽤来指向类本⾝。this指针⼀般可以省略。但在赋值运算符重载的时候要显⽰使⽤。静态成员函数没有this指针。
2、asm
_asm是⼀个语句的分隔符。不能单独出现,必须接汇编指令。⼀组被⼤括号包含的指令或⼀对空括号。
例:
_asm
{
mov al,2
mov dx,0xD007
out al,dx
}
也可以在每个汇编指令前加_asm
_asm mov al,2
_asm mov dx,0xD007
_asm out al,dx
3、*_cast
即 const_cast、dynamic_cast、reinterpret_cast、static_cast。
C++类型风格来性转换。const_cast删除const变量的属性,⽅便赋值;dynamic_cast⽤于将⼀个⽗类对象的指针转换为⼦类对象的指针或引⽤;reinterpret_cast将⼀种类型转换为另⼀种不同的类型;static_cast⽤于静态转换,任何转换都可以⽤它,但他不能⽤于两个不相关的类型转换。
备注:分类上有什么建议可以下⽅留⾔,会参考修改。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论