那些陌生的C++关键字
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++关键字的更多相关文章
- Java并发(3)- 聊聊Volatile
引言 谈到volatile关键字,大多数开发者都有一定了解,可以说是开发者非常熟悉,深入之后又非常陌生的一个关键字.相当于轻量的synchronized,也叫轻量级锁,与synchronized相比性 ...
- Java多线程编程那些事:volatile解惑--转
http://www.infoq.com/cn/articles/java-multi-thread-volatile/ 1. 前言 volatile关键字可能是Java开发人员“熟悉而又陌生”的一个 ...
- 区分C++和Java的this
区分C++和Java的this 今天早上写C++程序的时候,我习惯性地在程序中写了如下代码 void setY(int x){ this.x = x; } 编译器给我无情地报错了.后来想想,发现是自己 ...
- 作为一个新手的Oracle(DBA)学习笔记【转】
一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...
- Net中的常见的关键字
Net中的关键字有很多,我们最常见的就有new.base.this.using.class.struct.abstract.interface.is.as等等.有很多的,在这里就介绍大家常见的,并且有 ...
- Java Static关键字详解
提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...
- java中对final关键字的理解以及使用场景
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- C++中的4个类型转换关键字
转载:http://poplars.blog.163.com/blog/static/1394221742013021111210567/ n多书里面推荐要养成使用转型关键字的习惯,几年过去了,感觉还 ...
随机推荐
- C# vb .NET读取识别条形码线性条码ISBN
ISBN是比较常见的条形码编码规则类型的一种.如何在C#,vb等.NET平台语言里实现快速准确读取该类型条形码呢?答案是使用SharpBarcode! SharpBarcode是C#快速高效.准确的条 ...
- vue中路由拦截无限循环的情况
router.beforeEach(async (to, from, next) => { if (token) { if (whiteList.indexOf(to.path) != -1) ...
- 触发器TRIGGER 自增IDENTITY 聚集索引CLUSTERED
在触发器的“触发”过程中,有两个临时表inserted和deleted发生了作用.这两个特殊的临时表inserted和deleted,仅仅在触发器运行时存在,它们在某一特定时间和某一特定表相关. CR ...
- 【MySQL】rds 不支持镜像表/联合表,怎么办?
出于对业务的不了解,往往会让人做出错误的判断 CREATE TABLE `new_tables` ( `customer_id` int(11) NOT NULL AUTO_INCREMENT C ...
- msyql error: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A
mysql> use mydb Reading table information for completion of table and column names You can turn o ...
- 系统管理员必须知道的PHP安全实践
Apache web 服务器提供了这种便利 :通过 HTTP 或 HTTPS 协议,访问文件和内容.配置不当的服务器端脚本语言会带来各种各样的问题.所以,使用 PHP 时要小心.以下是 25 个 PH ...
- PAT 乙级 1038.统计同成绩学生 C++/Java
题目来源 本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即学生总人数.随后一行给出 N 名学生的百分制整数成绩,中间以空 ...
- 【转】Pandas学习笔记(三)修改&添加值
Pandas学习笔记系列: Pandas学习笔记(一)基本介绍 Pandas学习笔记(二)选择数据 Pandas学习笔记(三)修改&添加值 Pandas学习笔记(四)处理丢失值 Pandas学 ...
- 安装Visual Studio 时窗口闪过就退出
双击安装文件,窗口闪了下就退出了. 解决方法:控制面板 ———程序——程序和功能——打开或关闭Windows功能——关闭NET相关框架. 然后再次安装即可. 参考文献: VS安装程序一闪而过
- 201871010101-陈来弟《面向对象程序设计(java)》第二周学习总结
201871010101-陈来弟<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs ...