C++高效编程:阅读笔记1
在这本书的最后一章提到算法的陷阱的时候举了几个例子,记下两个。
1. 循环计数的覆盖
如果把1加到数值为255的字节上,该字节就会变为0。
unsigned char i;for (i = 0; i < 256; i++) {
cout << "test" << (int)i << endl;
}
这就会出现一个死循环了,因为255之后再加一就又为0了。
2. 数组和继承的混用
#include <iostream.h>
class AverageJoe
{
public:
long id;
};
class JetSet : public AverageJoe
{
public:
long VIP;
};
void setId(AverageJoe *person, long index, long number) {
person[index].id = number;
}
void main(void) {
JetSet vips[40];
for (int i = 0; i < 40; i++) {
vips[i].VIP = 1;
}
setId(vips, 1, 0);
if (1 == vips[0].VIP) {
cout << "VIP!!!" << endl;
} else {
cout << "Not Vip." << endl;
}
//test
cout << "Test : \n" << "vips[1].id :" << vips[1].id << endl;
cout << "vips[0].VIP :" << vips[0].VIP << endl;
}
类AverageJoe 的大小为4字节,而JetSet 为8字节,调用函数setId的时候指针按照AverageJoe 的大小操作,每次移动4字节。
修改方案:把setId函数定义为基类的成员函数。
没有评论:
发表评论