那些陌生的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多书里面推荐要养成使用转型关键字的习惯,几年过去了,感觉还 ...
随机推荐
- sql比较字符串,比的到底是什么?
sql里有nvarchar类型的日期数据time1:2019-10-09 00:00:00, 现给定string类型日期time2:2019-10-01 23:59:59,比较两个日期的大小, 发现可 ...
- 编译OpenCV提示opencv_contrib缺少boostdesc_bgm.i等文件
错误提示: ~/opencv_contrib/modules/xfeatures2d/src/boostdesc.:: fatal error: boostdesc_bgm.i: No such fi ...
- MySQL语言分类——DML
DML DML的全称是Database management Language,数据库管理语言.主要包括以下操作: insert.delete.update.optimize. 本篇对其逐一介绍 IN ...
- 【案例】电子生产中的排程问题如何解决?APS助力智能化排产
共进电子是典型的消费类电子制造企业,以ODM业务为主,立足双O(OEM/ODM),发展自主品牌.其中,生产模式特点包括: 批量制造.多品种小批量.面向订单生产: 产品结构复杂,设计变更频繁:生产计划复 ...
- WorkFlow四:添加用户决策步骤
沿用之前的例子,做个用户决策步骤. 1.事物代码SWDD: 进入抬头,点击类的绑定按钮. 2.选择类的绑定,点击继续. 这是类的绑定已经变色了.这时候点击保存,再点击返回到图片逻辑流界面. 3.在发送 ...
- 转:Oracle中SQL语句执行过程中
Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...
- MySQL数据库(二)--库相关操作、表相关操作(1)、存储引擎、数据类型
一.库相关操作 1.创建数据库 (1)语法 create database 数据库 charset utf8; (2)数据库命名规范 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 不能使用 ...
- 《linux就该这么学》课堂笔记20 LNMP架构部署动态网站环境
源码包安装程序 使用源码包来安装服务程序具有两个优势. 源码包的可移植性非常好,几乎可以在任何Linux系统中安装使用,而RPM软件包是针对特定系统和架构编写的指令集,必须严格地符合执行环境才能顺利安 ...
- 逆向破解之160个CrackMe —— 023-024
CrackMe —— 023 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- KL散度=交叉熵-熵
熵:可以表示一个事件A的自信息量,也就是A包含多少信息. KL散度:可以用来表示从事件A的角度来看,事件B有多大不同. 交叉熵:可以用来表示从事件A的角度来看,如何描述事件B. 一种信息论的解释是: ...