C/C++中的关键字如下:

下面我们主要介绍一些比较陌生的关键字,一些常见的关键字这里就不再赘述了。

1、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

2、catch、throw、try

用于异常处理。try 用来标识可能出现的异常代码段,catch可以捕获异常,异常由throw抛出。throw 必须在 try 代码块中,后边跟的值决定抛出异常的类型。示例如下:

try
{
// 可能出异常的程序
throw ... // 掏出异常
}
catch(表达式)
{ }

C++ 中的异常处理机制只能处理由 throw 捕获的异常,没有捕获的将被忽略。使用try{ } catch() { }语句来捕获异常,把可能发生异常的代码放在try{ }语句块中,后面跟若干个catch() { }语句负责处理具体的异常类型,这样一组有 try 块和不少于一个的 catch 块就构成了一级异常捕获。

3、auto

auto关键字会根据初始值自动推断变量的数据类型。但不是每个编译器都支持auto。示例如下:

auto  x = 7;  // 使用整数7对变量x进行初始化,可推断x为int型。
auto y=1.234; // 使用浮点数1.234对变量y进行初始化,可推断y为double型。

4、*_cast

即 const_cast、dynamic_cast、reinterpret_cast、static_cast。

C++类型风格的类型转换符。const_cast删除const变量的属性,方便赋值;dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用;reinterpret_cast将一种类型转换为另一种不同的类型;static_cast用于静态转换,任何转换都可以用它,但他不能用于两个不相关的类型转换。

注:具体使用可以参考我的另一篇博客:C++中的四种强制类型转换符详解

5、typeid

从名字直观看来,该关键字应该是获取语言元素的类型ID。有时候代码可能需要获取某个变量或者类型的名字,这时候使用typeid就比较合适。示例如下:

typeid(int).name(); // 获取int类型名,结果为“int”
typeid(1)!= typeid(1.0); // 比较表达式类型,结果为true

6、typename

typename在函数模板和类模板声明中使用。一般模板声明中,使用class关键字指定类型参数,后来C++支持使用typename代替class关键字。这里typename和class没有任何区别。示例如下:

template<class  T, class Y>;
// 可以用下面替代
template<typename T, typename Y>

7、mutable

Mutable的含义是可变的,它和const关键字是相对的。我们知道类的常成员函数在语义上是不允许修改类的成员变量的,但是有时候可能根据代码的需要并不是这么绝对。那么就可以使用mutable声明一个类的成员变量,它告诉编译器类的常成员函数可以修改这个变量。示例如下:

class MyClass
{
mutable int member;
void constFun()const
{
member=0;
}
};

如果不使用mutable修饰member定义,就会编译报错。

8、explicit

explicit的含义是显式的,该关键字的作用就是阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

在C++中,如下声明是合法的:

class String
{
String(const char* p);
}; String s1 = "hello"; // 合法

上例中,String s1 = "hello"会执行隐式转换,等价于String s1 = String("hello")。为了避免这种情况的发生,可以在函数声明前面加上explicit,禁止隐式类型转换。示例如下:

class String
{
explicit String(const char* p);
}; //String s1 = "hello"; // 非法报错

9、export

使用该关键字可实现模板函数的外部调用。对模板类型,可以在头文件中声明模板类和模板函数;在代码文件中,使用关键字export来定义具体的模板类对象和模板函数;然后在其他用户代码文件中,包含声明头文件后,就可以使用该这些对象和函数。

10、operator

和操作符连用,指定一个重载了的操作符函数,比如,operator ++。示例如下:

class Time
{
public:
// 重载后缀递增运算符( ++ )
// 后置递增就是增加当前对象的值,并且返回增加值之前的该对象
Time operator ++(int)
{
Time origin = *this; // 保存原先未改变的对象
second++;
return origin;
} private:
int second;
};

11、volatile

volatile 是易变的意思,被其修饰的变量,编译器不会对其进行优化。所以每次用到它的时候都是直接从对应的内存当中提取,而不会利用 cache(缓存)或寄存器中的原有数值,以适应它的未知何时会发生的变化。它一般用来修饰多线程间被多个任务共享的变量和并行设备硬件寄存器等。例如:

int a = 0;
int b = a;
int c = a + 1;

编译器极可能把 a 放在寄存器中,供 b,c 的计算使用。更有甚者,编译器确定 a 的值是0,会直接计算出 b=0,c=1。如果在实际运行中 a 的值被其他线程修改,这么做就改变了代码的语意。为了消除这种问题,使用 volatile 关键字取消优化,让编译器每次访问 a 的时候都需要读内存,而不是读寄存器中可能被修改的值。

参考:

那些陌生的C++关键字

C++关键字详解

那些陌生的C++关键字的更多相关文章

  1. Java并发(3)- 聊聊Volatile

    引言 谈到volatile关键字,大多数开发者都有一定了解,可以说是开发者非常熟悉,深入之后又非常陌生的一个关键字.相当于轻量的synchronized,也叫轻量级锁,与synchronized相比性 ...

  2. Java多线程编程那些事:volatile解惑--转

    http://www.infoq.com/cn/articles/java-multi-thread-volatile/ 1. 前言 volatile关键字可能是Java开发人员“熟悉而又陌生”的一个 ...

  3. 区分C++和Java的this

    区分C++和Java的this 今天早上写C++程序的时候,我习惯性地在程序中写了如下代码 void setY(int x){ this.x = x; } 编译器给我无情地报错了.后来想想,发现是自己 ...

  4. 作为一个新手的Oracle(DBA)学习笔记【转】

    一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...

  5. Net中的常见的关键字

    Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...

  6. Java Static关键字详解

    提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...

  7. java中对final关键字的理解以及使用场景

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.

  8. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  9. C++中的4个类型转换关键字

    转载:http://poplars.blog.163.com/blog/static/1394221742013021111210567/ n多书里面推荐要养成使用转型关键字的习惯,几年过去了,感觉还 ...

随机推荐

  1. asp.net webapi 随笔

    第一次写博客,文笔有限,记录下学习的过程 话不多说,直接开干 首先用vs2017建立一个空网站项目,然后只勾选api 项目建立后,如下结构 其中WebApiConfig类配置了路由相关信息 publi ...

  2. MySQL 8.0.13安装修改密码的一个问题,记录一下。

    https://blog.csdn.net/qq_37350706/article/details/81707862 关于安装MySQL 8.0.13,本人就不多说了,上面这个链接讲的非常详细 请参考 ...

  3. el-upload进度条无效,on-progress无效问题解决方案

    事先声明,本人系.net后端老菜鸟,vue接触没有多长时间,如果存在技术分享错误,切莫见怪,第一次写博,还请大佬们多多担待,转载请注明出处谢谢! 最近项目用到饿了么上传,于是参照官网接入el-uplo ...

  4. 跟随腾讯WeTest一起来2019Unreal Open Day!

      WeTest 导读 Unreal Open Day 是由 Epic Games 中国一年一度倾力打造的面向虚幻引擎开发者的技术分享活动,是引擎行业规格最高.规模最大.阵容最强的年度盛会之一. 自从 ...

  5. open_basedir restriction in effect

    vim /usr/local/nginx/conf/fastcgi.conf fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_ro ...

  6. Alipay支付宝支付 报错 invalid [default store dir]: /tmp/

    1.如果使用支付宝sdk,首先lotusphp_runtime 文件也要一起使用  支付宝现在的php sdk中有lotus框架可以和aop文件. 2.保证AopSdk.php文件中的方法可以走到这个 ...

  7. 【Tomcat】Web应用的目录结构

    创建时间:6.14 Web应用的目录结构 .xml文件不用自己写,抄头抄尾就可以 (别人的) (抄头抄尾) *注意:WEB-INF目录是受保护的,外界不能直接访问 如果访问WEB-INF目录下的htm ...

  8. django rest framework 解析器组件 接口设计,视图组件 (1)

    一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.d ...

  9. 安装glibc

    wget http://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gztar -zxvf glibc-2.23.tar.gz cd glibc-2.23 mkdir b ...

  10. Django 购物车模板

    url from django.contrib import admin from django.urls import path, re_path from django.urls import i ...