笔试复习_C++_类(一)
2017-09-05 14:55
120 查看
类(class)是面向对象程序设计实现信息封装的基础。类是用户定义类型,每个类包含数据说明和操作数据的函数,类的实例称为对象。
1.结构
结构是用户定义的数据类型,包含数目固定的成员,每个成员可以是不同类型。一个结构变量在内存中占有连续的存储空间并且存储空间是对齐的。
①声明类型之后声明变量
②类型声明同时声明变量,可以同时初始化
③直接声明类型结构变量(此时没有结构类型标识符)
计算机中存储空间按照字节划分,理论上任何类型变量都可以从任意地址开始,但是实际上访问特定的变量从特定的地址开始,需要各种类型的变量按照规则在空间上排列,这就是对齐。
例如:
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)是:
解:
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)
首先考虑没有这句话时,我们在类、结构或者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
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
相关文章推荐
- 笔试复习_C++_指针(一)
- C++复习4.笔试复习
- C++程序员笔试复习概要(一)
- 笔试复习_C++_指针(二)
- C++笔试题 String类的实现 三大复制控制函数
- 【C++复习五】inline和宏
- 暑期C++第一天复习
- C/C++ 笔试、面试题目大汇总
- C++笔试面试遇到的问题
- C++考前复习——继承构造的顺序
- 一道c++笔试题
- [互联网面试笔试汇总C/C++-2] 网易有道-1
- C++复习 02 变量和基本类型
- c/c++笔试题(1)
- 2015百度实习生C++笔试题
- C++复习 11 泛型算法
- 重拾C++经典笔试30题(1-10)
- C++常见知识点复习-如何限制类对象只能在堆上或者栈上分配
- C/C++笔试必须熟悉掌握的头文件系列(三)——stdlib.h/cstdlib
- 一份C/C++实习生笔试试卷(基础部分 )