您的位置:首页 > 编程语言 > C语言/C++

笔试复习_C++_类(一)

2017-09-05 14:55 120 查看
类(class)是面向对象程序设计实现信息封装的基础。类是用户定义类型,每个类包含数据说明和操作数据的函数,类的实例称为对象。

1.结构

结构是用户定义的数据类型,包含数目固定的成员,每个成员可以是不同类型。一个结构变量在内存中占有连续的存储空间并且存储空间是对齐的。

struct 类型名
{
类型 成员1;
类型 成员2;
...
类型 成员n;
};


①声明类型之后声明变量

struct  employee
{   char  name [ 10 ] ;
long  code ;
float  salary ;
char address [ 50 ] ;
char  phone [ 20 ] ;
} ;
employee  worker1, worker2, *Emp ;


②类型声明同时声明变量,可以同时初始化

struct  employee
{  char  name [ 10 ] ;
long  code ;
float  salary ;
char address [ 50 ] ;
char  phone [ 20 ] ;
} ;worker1, worker2, *Emp ;


③直接声明类型结构变量(此时没有结构类型标识符

struct
{  char  name [ 10 ] ;
long  code ;
float  salary ;
char address [ 50 ] ;
char  phone [ 20 ] ;
} ;worker1, worker2, *Emp ;


计算机中存储空间按照字节划分,理论上任何类型变量都可以从任意地址开始,但是实际上访问特定的变量从特定的地址开始,需要各种类型的变量按照规则在空间上排列,这就是对齐。

例如:

struct MyStruct
{
double dda1;
char dda;
int type;
};


sizeof(MyStruct)不等于sizeof(double)+sizeof(char)+sizeof(int)=13而是等于16。

由于对齐规则,为了提高存储速度,默认情况下变量存放的起始地址相对于结构起始地址的偏移量必须为该变量所占字节的倍数。在32位系统中:

Char 偏移量必须为sizeof(char)即1的倍数

int 偏移量必须为sizeof(int)即4的倍数

float 偏移量必须为sizeof(float)即4的倍数

double 偏移量必须为sizeof(double)即8的倍数

Short 偏移量必须为sizeof(short)即2的倍数

示例:





例题:

1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是:

struct A
{
int a;
short b;
int c;
char d;
};
struct B
{
int a;
short b;
char c;
int d;
};


解:

A:int+4,short+2,后面有int所以填充2,int+4,char+1不够4再填充3一共16。

B:int+4,short+2,char+1,后面有int填充1,int+4一共12。

2.sizeof(bu)的值是()

#pragma pack(2)
class BU
{
int number;
union UBffer
{
char buffer[13];
int number;
}ubuf;
void foo(){}
typedef char*(*f)(void*);
enum{hdd,ssd,blueray}disk;
}bu;


解:

注意第一行,#pragma pack(2)

首先考虑没有这句话时,我们在类、结构或者union补齐字节的时候,找它们的成员数据中找字节最大的那个数去衡量如何对齐,但是有了这句话以后,对齐方式是取 pack(n)中n和字节最大数值的最小值去对齐;可见本题中对齐字节数为2;

int+4;

UBffer中, union的大小取决于它所有的成员中,占用空间最大的一个成员的大小,并且需要内存对齐,buffer+13,由于对齐字节位2,所以ubuf结构体一共14字节。

void foo(){}函数声明不占用空间。

typedef char*(f)(void);声明不占用空间。

enum{hdd,ssd,blueray}disk;枚举类型为4个字节。

所以大小一共4+14+4=22
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: