21天学通C++--阅读笔记7(异常、宏、位操作)

异常

异常情况解决措施:使程序崩溃;通知用户并退出;通知用户并恢复执行;不通知用户继续执行正确操作。

 

异常捕获:

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枚举类型的值。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值