今天,我们来分享c++语法中的关键字,在c++学习中,关键字有很多,如const,static,enum等等。
下面是c++语法中的全部关键字(好像是73个)
大部分在基础语法学习中的已经见过了,现在我们来看看几个不常见又有时候起关键作用的关键字吧。
1.char、wchar_t
表示字符型和宽字符型这些整数类型(属于基本类型),但一般只专用于表示字符。char(和signed char、unsigned char一起)事实上定义了字节的大小。char表示单字节字符,wchar_t表示多字节字符
2.signed和unsigned
signed和unsigned作为前缀修饰整数类型,分别表示有符号和无符号。signed和unsigned修饰char类型,构成unsigned char和signed char,和char都不是相同的类型;不可修饰wchar_t、char16_t和char32_t。其它整数类型的signed省略或不省略,含义不变。signed或unsigned可单独作为类型,相当于signed int和unsigned int。
long double则是C++11指定的精度不小于double的浮点数。
3.explicit
该关键字的作用就是避免自定义类型隐式转换为类类型。 explict只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的,防止类构造函数的隐式自动转换。如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了。
但是, 也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数,
explicit CxString(int age, int size = 0)
{ _age = age; _size = size; // 代码同上, 省略... }
CxString(const char *p)
{ // 代码同上, 省略... }
4.auto
auto关键字会根据初始值自动推断变量的数据类型。不是每个编译器都支持auto。
例:
auto x = 7; //使用整数7对变量x进行初始化,可推断x为int型。
auto y=1.234; //使用浮点数1.234对变量y进行初始化,可推断y为double型。
5.break,continue和goto
break用于跳出for、while循环或switch语句。continue用于调到一个循环的起始位置。goto用于无条件跳转到函数内得标号处。一般情况不建议使用goto,风险较大。
6.const、volatile
const和volatile是类型修饰符,语法类似,用于变量或函数参数声明,也可以限制非静态成员函数。const表示只读类型(指定类型安全性,保护对象不被意外修改),volatile指定被修饰的对象类型的读操作是副作用(因此读取不能被随便优化合并,适合映射I/O寄存器等)。
volatile:
a、当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中,以后再取变量值时,就直接从寄存器中取值。
b、优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存到寄存器里的备份。
c、volatile适用于多线程应用中被几个任务共享的变量。
7.enum
构成枚举类型名的关键字。
8.export
使用该关键字可实现模板函数的外部调用。对模板类型,可以在头文件中声明模板类和模板函数;在代码文件中,使用关键字export来定义具体的模板类对象和模板函数;然后在其他用户代码文件中,包含声明头文件后,就可以使用该这些对象和函数。
9.extern
当出现extern “C”时,表示 extern “C”之后的代码按照C语言的规则去编译;当extern修饰变量或函数时,表示其具有外部链接属性,即其既可以在本模块中使用也可以在其他模块中使用。
10.static
可修饰变量(静态全局变量,静态局部变量),也可以修饰函数和类中的成员函数。static修饰的变量的周期为整个函数的生命周期。具有静态生存期的变量,只在函数第一次调用时进行初始化,在没有显示初始化的情况下,系统把他们初始化为0。
11.union
union是联合体类型。满足特定条件类类型——POD struct或POD union可以和C语言中的struct和union对应兼容。注:POD类型(Plain Old Data),plain---代表普通类型,old---代表可以与C语言兼容。
12.mutable
mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。
13.catch、throw、try
用于异常处理。try指定try块的起始,try块后的catch可以捕获异常。异常由throw抛出。throw在函数中还表示动态异常规范。
14.inline
内联函数,在编译时将所调用的函数代码直接嵌入到主调函数中。各个编译器的实现方式可能不同。
15.operator
和操作符连用,指定一个重载了的操作符函数,比如,operator+。
16.register
提示编译器尽可能把变量存入到CPU内部寄存器中。
17.typeid
typeid是一个操作符,返回结果为标准库种类型的引用。
18.this
每个类成员函数都隐含了一个this指针,用来指向类本身。this指针一般可以省略。但在赋值运算符重载的时候要显示使用。静态成员函数没有this指针。
19.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
20.*_cast
即 const_cast、dynamic_cast、reinterpret_cast、static_cast。
C++类型风格来性转换。const_cast删除const变量的属性,方便赋值;dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用;reinterpret_cast将一种类型转换为另一种不同的类型;static_cast用于静态转换,任何转换都可以用它,但他不能用于两个不相关的类型转换。
21.implict
与explicit关键字相反,explict只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的,防止类构造函数的隐式自动转换。而implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).没有使用explicit关键字的类声明, 即默认为隐式声明
22.memset
其实memset不是一个关键字,它是一个函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。常用于内存空间初始化。
void *memset(void *s, int ch, size_t n);
memset解释:将s中当前位置后面的n个字节用ch替换并返回s。memset作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 。
memset()函数原型是extern void *memset(void *buffer, int c, int count) ,buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度。
23.emplace
C++11中,针对顺序容器(如vector、deque、list),新标准引入了三个新成员:emplace_front、emplace和emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应push_front、insert和push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。
我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。emplace成员使用这些参数在容器管理的内存空间中直接构造元素。emplace函数在容器中直接构造元素。传递给emplace函数的参数必须与元素类型的构造函数相匹配。用法和push_front、insert和push_back相似,都是emplace(数字)
24.decltype
decltype是C++11新增的一个关键字,和auto的功能一样,用来在编译时期进行自动类型推导。引入decltype是因为auto并不适用于所有的自动类型推导场景,在某些特殊情况下auto用起来很不方便,甚至压根无法使用。作用:获取表达式类型
另外,auto要求变量必须初始化,这是因为auto根据变量的初始值来推导变量类型的,如果不初始化,变量的类型也就无法推导。auto根据=右边的初始值推导出变量的类型。而decltype不要求,因此可以写成如下形式:decltype(exp) varName;decltype根据exp表达式推导出变量的类型,跟=右边的value没有关系,可以没有等号。如:
int i;
decltype(i) j;
就创建了一个j 类型是int类型(和i的类型相同)
好啦,关于c++关键字的分享就到这啦,如果以后博主有发现未曾见过的关键字,也会随时更新的
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.