那些陌生的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多书里面推荐要养成使用转型关键字的习惯,几年过去了,感觉还 ...
随机推荐
- 输入www.baidu.com会发生什么
1. 浏览器接收域名 2. 发送域名给DNS,请求解析出www.baidu.com的IP地址 中文名字是域名系统服务器,一般位于ISP(互联网服务提供商,比如我们熟知的联通.移动.电信等) 中.浏览器 ...
- Python——全国瓜子二手车数据分析
继瓜子二手车数据爬去之后,在此进行处理分析 Pycharm代码 # coding:utf8 # author:Jery # datetime:2019/5/3 17:35 # software:PyC ...
- Java高级工程师面试宝典
Java高级工程师面试宝典 JavaSE 多线程 进程与线程的区别? 答:进程是所有线程的集合,每一个线程是进程中的一条执行路径,线程只是一条执行路径. 为什么要用多线程? 答:提高程序效率 多线程创 ...
- python课程单元三编程题讲解(上)
目录 1.快乐的数字 2.凯撒密码I 3.凯撒密码II 4.括号配对检测 A @ 下面向大家介绍一下我在学习python课程的一些题目的解法,如果大家有什么更好的解法请私信我.这里只显示题目与 ...
- SQL Server Compact 3.5环境部署<转>
通过使用 Microsoft Visual Studio 开发环境,可以开发使用 SQL Server Compact 3.5 的应用程序.Visual Studio 是开发和部署使用 SQL Ser ...
- 【转载】Gradle学习 第二章:概述
转载地址:http://ask.android-studio.org/?/article/6 Here is a list of some of Gradle's features.<翻译> ...
- Spring之IoC详解(非原创)
文章大纲 一.Spring介绍二.Spring的IoC实战三.IoC常见注解总结四.项目源码及参考资料下载五.参考文章 一.Spring介绍 1. 什么是Spring Spring是分层的Java ...
- AMD Ryzen一代、二代CPU一览表
Ryzen一代(14纳米).二代(12纳米)CPU一览表 http://img30.360buyimg.com/sku/jfs/t1/1134/23/12713/382299/5bd910f9E63b ...
- 数据结构篇——平衡二叉树(AVL树)
引入 上一篇写了二叉排序树,构建一个二叉排序树,如果构建序列是完全有序的,则会出现这样的情况: 显然这种情况会使得二叉搜索树退化成链表.当出现这样的情况,二叉排序树的查找也就退化成了线性查找,所以我们 ...
- JMeter基础【第二篇】JMeter5.1介绍及脚本录制
测试计划:被测项目 线程组:测试场景 取样器:被测接口 添加HTTP代理服务器和线程组,默认端口是8888 排除模式可以设置过滤 启动 点击[OK] IE浏览器设置代理 IE浏览器访问百度首页,搜索“ ...