位域的声明形式
?数据类型说明符 ? 成员名 : 位数;
位域的作用 通过“打包”,使类的不同成员共享相同的字节,从而节省存储空间。
注意事项 具体的打包方式,因编译器而异;
只有bool、char、int和枚举类型的成员,允许定义为位域;
节省空间,但可能增加时间开销。
例:设计一个结构体存储学生的成绩信息,需要包括学号、年级和成绩三项内容,学号的范围是0到99,999,999,年级分为freshman、sophomore、junior、senior四种,成绩包括A、B、C、D四个等级。
#include <iostream>
using namespace std;
enum Level { FRESHMAN, SOPHOMORE, JUNIOR, SENIOR };
enum Grade { A, B, C, D };
class Student {
public:
Student(unsigned number, Level level, Grade grade)
: number(number), level(level), grade(grade) { }
void show();
private:
unsigned number : 27;
Level level : 2;
Grade grade : 2;
};
void Student::show() {
cout << "Number: " << number << endl;
cout << "Level: ";
switch (level) {
case FRESHMAN: cout << "freshman"; break;
case SOPHOMORE: cout << "sophomore"; break;
case JUNIOR: cout << "junior"; break;
case SENIOR: cout << "senior"; break;
}
cout << endl;
cout << "Grade: ";
switch (grade) {
case A: cout << "A"; break;
case B: cout << "B"; break;
case C: cout << "C"; break;
case D: cout << "D"; break;
}
cout << endl;
}
int main() {
Student s(12345678, SOPHOMORE, B);
cout << "Size of Student: " << sizeof(Student) << endl;
s.show();
return 0;
}
运行结果:(运行结果第一行会因编译环境的不同而有所差异)
Size of Student: 4
Number: ? ?12345678
Level: ? ? sophomore
Grade: ? ? B
|