异常
异常情况解决措施:使程序崩溃;通知用户并退出;通知用户并恢复执行;不通知用户继续执行正确操作。
异常捕获:
try{
//可能产生异常的代码
}catch(...){
//异常处理,清除分配的内存
}
异常类:
class ClassA{
//异常类
class ClassExcp{
public:
ClassExp(string errmsg){...};
showErrMsg(){...};
};
void methodA(){
if(...) throw ClassExcp("err from methodA");//抛出异常
}
}
try{
ClassA objA;
objA.methodA();
}catch(ClassA::ClassExcp&exp){
cout<<exp.showErrMsg<<endl;
}
注:异常类可继承,一般异常基类定义虚函数,由派生类重载。
预处理器
在运行编译器时,预处理器先运行,查找预处理器指令(以'#'开头),将预处理的文件写入相应位置,形成中间源码文件;编译器读取并编译该文件。
eg,
#define BIG512
intarray[BIG];//源码
intarray[512];//预处理器输出结果
//预处理器检查已建立的一个表看是否定义了BIG,然后写入相应代码段,多用于防止头文件多次引入
#ifdef BIG
…//定义了BIG
#else
...
#endif
宏函数
#define MAX(x,y)((x) > (y)? (x) : (y))
MAX(1, 2);
注:在预处理的时候,宏替换调用部分。
//字符串化,"#"将之后的参数x加""号,直到下一个空格为止。
#definePRINTSTRING(x) cout<<#x
PRINTSTRING(Helloworld!);//处理为cout<<"Helloworld!";
//字符串连接,"##"
#defineListof(Type) class Type##List \
{\
public: \
Type##List(){} \
};
Listof(int);
//预处理为
class intList
{
public:
intList(){}
};
//预定义宏
_DATE_:当前日期
_TIME_:当前世界
_LINE_:当前行号
_FILE_:当前文件名称
assert();
位操作(&、|、^、~)
主要用于多个标识符
&:与,两位都为1->1
| :或,两位有一个为1->1
^ :异或,两位不同-> 1
~ :求补,1->0, 0->1,~10100011 = 01011100
设置位:
eg. 将2个字节的第八位设置为1
10100110 00100110----原数
0000 0000 1000 0000----128
--------------------------------或操作
10100110 10100110----结果
清除位:
eg.将2个字节的第八位设置为0
10100110 00100110----原数
1111 1111 0111 1111----~128
--------------------------------与操作
10100110 00100110----结果
反转位:
eg. 将2个字节的第八位反转
10100110 00100110----原数
0000 0000 1000 0000----128
--------------------------------异或操作
10100110 10100110----结果
补充:
| 正数(+7) | 负数(-7) | 说明 |
机器数 | 0000 0111 | 1000 0111 |
|
原码 | 0000 0111 | 1000 0111 | 符号位+数据 |
反码 | 0000 0111 | 1111 1000 | 正数的反码=原码; 负数的反码符号位不变,数据位取反 |
补码 | 0000 0111 | 1111 1001 | 正数的补码=原码; 负数的补码=反码+1 |
位域
enumENUM1{Param1_value1, Param1_value2, Param1_value3, Param1_value4};
enumENUM2{Param2_value1, Param2_value2}
class ClassA{
unsigned m_param1 : 2;
unsigned m_param2 : 1;
ClassA : m_param1(Param1_value1), m_param2(Param2_value1){}
};
ClassA的长度为3位,前两位用于表示ENUM1枚举类型的值,后一位表示ENUM2枚举类型的值。