c++高阶语法(三)

今天,我们来分享c++语法中的关键字,在c++学习中,关键字有很多,如const,static,enum等等。

下面是c++语法中的全部关键字(好像是73个)

c++高阶语法(三)_第1张图片

大部分在基础语法学习中的已经见过了,现在我们来看看几个不常见又有时候起关键作用的关键字吧。

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++关键字的分享就到这啦,如果以后博主有发现未曾见过的关键字,也会随时更新的

本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.

你可能感兴趣的:(C++,c++)