c++随笔

来源:互联网 发布:黄金策略软件 编辑:程序博客网 时间:2024/06/07 08:03

1、关键字explicit

C++隐式类类型转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。《C++primer p394

关键字explicit可以禁止“单参构造函数”被用于自动类型转换。

例如:


Class CAge1{   int  m_iAge; public:   age(int iAge){m_iAge = iAge;}}
Class CAge2{   int  m_iAge; public:   explicate age(int iAge){m_iAge = iAge;}} 
void main{CAge1 age1 = 5;//隐式调用成功,编译器自动调用单参构造函数构造一个临时对象。CAge2 age2 = 5;//隐式调用失败,有关键字explicate,无法隐式自动调用单参构造函数CAge2 age3(5);//显示调用成功}

2、关键字mutable

C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。例如可以在const函数里可以修改mutable类型的成员变量。

 

3、关键字volatile

volatile作为指令关键字,确保本条指令不会因为编译器的优化而省略,且要求每次直接读值。简而言之就是防止编译器对代码进行优化。

.比如如下程序:

  XBYTE[2]=0x55;

  XBYTE[2]=0x56;

  XBYTE[2]=0x57;

  XBYTE[2]=0x58;

如果对外部硬件上述四条语句分别表示不同的操作,会产生四种不同的动作,那么编译器就不能像对待纯粹的程序那样对上述四条语句进行优化只认为XBYTE[2]=0x58;而忽略前三条语句(即只产生一条机器代码),此时编译器会逐一的进行编译并产生相应的机器代码(四条).

优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

  1). 并行设备的硬件寄存器(如:状态寄存器)

  2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3). 多线程应用中被几个任务共享的变量

一般说来,volatile用在如下的几个地方:

  1) 中断服务程序中修改的供其它程序检测的变量需要加volatile;

  2) 多任务环境下各任务间共享的标志应该加volatile;

  3) 存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;


4、头文件防止被多次编译,

       1)  #pragma once 与编译器相关、只被部分编译器能识别,例如VS2008之类的就可以在头文件中加上此句,也就相当于下面介绍的#ifndef.....#endif了,使用起来比较简单,能少敲两行代码。

       2)#ifndef.....#endif 与语言相关,这就是个宏,所以对于所有的C/C++编译器都支持,相对于#pragma once,写起来还是相对麻烦的,毕竟多写了好几行代码,该宏的具体定义形式为:

#ifndef TEST_H
#define TEST_H

//头文件中的所有东西都放在这个宏中间。

#endif //TEST

另外,宏的名字一般为文件名字全大写,把"."替换成"_",例如头文件名字为test.h,那么此头文件中的宏的名字就是TEST_H