11.ANSI C++一些不常用的关键字(摘自<<C++语言命令详解(第二版)>>)
(1)asm(解释汇编代码)
尽管ANSI规范支持asm关键字来解释汇编代码,但是它的使用是依具体软件而定的.主要的编译器供应商提供他们自己对这个关键字的扩展.汇编代码是一种机器语言而且不容易移植.当使用汇编代码时,应尽可能把它限制在尽可能少的模块中.查看编译器文件以获得更多的信息.
(2)auto(分配自动变量)
C++中有一些很恼人的关键字,其中最讨厌的是auto关键字,因为它为没用的目的服务.auto关键字用于局部变量的定义,它指定自动存储类.(这样就指定了函数的每个调用都要建立自己的对变量的拷贝,通常是放在程序的堆栈段.)因为局部变量本身就是存储类,所以auto关键字基本上这些拷贝什么都没有做.
(3)explicit(禁止自动转换)
构造函数自动支持类型转换,如定义对象是可以使用myclass ob(expr)或myclass = expr,后者就是自动(隐式)的类型转换。而explicit关键字禁止这种自动转换.在使用这个关键字时,应将它放在类定义内构造函数声明的前面.
(4)mutable(使const类型可改变)
如果一个对象被声明为const型,那么它所有的成员就都是const类型的,它们是不能被改变的.但是有时候你可能要为一个特殊的成员设定一个例外情况.如果把一个成员函数定义为const,则这个函数只能修改类中用mutable修饰的变量,这就是mutable关键字所能做的.
(5)register(将变量放在CPU的寄存器中)
register关键字请求将一个变量放置在中央处理器的内部寄存器中.如果在程序中多次使用这个变量,将其放在存储器中能够提高程序的运行速度.
Register关键字的使用与编译器没有必然联系.它只是寄存器应该如何被分配的一个建议或暗示.为了达到优化目的,现代的编译器倾向于形成自己的关于寄存器分配的看法,这使得这个关键字几乎失去了原来的意义.
(6)volatile(要求对数据进行刷新)
volatile关键字暗示某对象是不稳定的.在计算机术语中,一个外部用户可以改变一个可变的对象而不会被警告,这个可变对象可以是操作系统或计算机时钟.每当程序涉及到这个对象时,都需要执行直接内存访问(DMA)操作.编译器不能将这个值放在寄存器中并使它保持当前的状态.
当将volatile关键字应用于一个声明时,它就会通知编译器这个数据对象是可变的,在每次访问它之前程序必须更新它的值.
Volatile关键字主要出现在系统程序中.
12.预处理器指令,宏和运算符(摘自<<C++语言命令详解(第二版)>>)
#define 定义符号或宏
#elif 在另一条件下编译
#else 在条件为假的情况下编译
#endif 终止条件块
#error 停止并汇报错误
#if 在条件成立时编译
#ifdef 如果符号被定义则进行编译
#ifndef 在符号末定义的条件下编译
#include 读入头文件
#line 设置行号与源文件
#pragma 设置编译器所指定的特性
#undef 删除符号定义
预定义宏:
__cplusplus 在C++模块下被定义
__DATE__ 当前日期
__FILE__ 当前源文件(包括路径名)
__LINE__ 当前源代码行号
__TIME__ 当前时间
__STDC__ 标准C编译
预处理器运算符:
defined(symbol) 如果symbol被定义则返回1,否则返回0
#str 将一字符串str放入被引号括起的字符串
text1##text2 将text1和text2连接起来
13.有关类里面的属性的初始化的问题
属性的初始化只能在函数里面进行.
例如:
class Person{
private:
char *Name;
public:
Person(){Name=new char[50];}//在构造函数里面为指针Name置首地址
~Person(){}
};
14.有关指针初始化的问题
不能直接用p=NULL来给指针初始化,要先给p分配空间后才能给p赋值
15.再看一个指针与数组的例子
#include<iostream.h>
void main()
{
char ch[]="fowenler";
cout<<"input 1:"<<endl;
cout<<ch<<endl;//fowenler
cout<<&ch<<endl;//0x0012FF74
cout<<&ch+1<<endl;//0x0012FF7D
cout<<&ch+2<<endl;//0x0012FF86
cout<<&ch+3<<endl;//0x0012FF8F
cout<<&ch+4<<endl;//0x0012FF98
cout<<ch+3<<endl;//enler
}
由上面可以知道cout是ostream类的一个实例,<<是被重载了的,它所需要的参数是地址值,cout<<ch是输出以ch为首地址的字符数组内容,cout<<&ch就是输出首地址的值,而cout<<&ch+1是输出数组中第二个元素的地址值,因为这个数组是char型的,它占8位,所以&ch+1的值比&ch的值大8(FD-74=9,刚好两者之间差8).cout<<ch+3就是指从数组的第三个元素后开始输出字符.
16.关键字static的特性及其好处:
如果对象中的某一属性或成员函数与特定对象无关时,可以在类中将此属性或成员函数定义为static。这样可以使多个实例共用一个内存块,因此使用static声明函数和变量可以节省内存空间。
用static声明一个变量或一个函数后,变量和函数所驻留的内存地址是不变的。即变量名和函数名在映射内存地址的时候是固定的。
使用static声明类的一个成员函数后,可以不产生实例就能调用该函数,但static成员函数里面所使用的变量也应该是static的。Static成员函数没有this指针。
要使用类中的static属性和方法可以直接用类名来访问。如A﹒fun(),A是类名。
在一个项目中的多个文件中如果有多个函数使用同一个函数名字,就可能会产生冲突。如果用了static定义它们,他们就会相安无事。