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

类(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值