c++面向对象
- 内存字节对齐
- 面向对象三大特性
- 双冒号、using和namespace
- 内联函数和函数重载
- 虚函数可以是内联函数吗
- 构造函数/析构函数
- 拷贝构造函数与深浅拷贝
- 只在堆上/栈上创建对象
- this指针
- 常函数和常对象
- delete this合法吗
- 为什么空类大小不为0
- 静态成员变量与静态成员函数
- 能否通过初始化列表初始化静态成员变量
- 初始化列表的好处和使用条件
- 友元全局函数、友元类、友元成员函数
- 运算符重载及++重载实现
- 继承方式、对象模型、同名处理
- 多继承和菱形继承
- 静态函数可以是虚函数吗
- 类型兼容性原则-为什么会有多态
- 重载、覆盖、重写
- 多态实现的基础
- 静态多态和动态多态
- 虚函数指针和虚函数表
- 函数指针与指针函数
- 怎么理解多态和虚函数
- 构造函数能否实现多态/虚函数指针什么时候初始化
- 构造函数能否是虚函数
- 抽象类和纯虚函数
- 虚析构和纯虚析构
- 为什么析构函数必须是虚函数
- 为什么C++默认的析构函数不是虚函数
- 类模板和函数模板
内存字节对齐
#pragma pack(n)
表示的是设置n字节对齐,windows默认是8,linux是4
struct A{
char a;
int b;
short c;
};
- char占一个字节,起始偏移为零,int占四个字节,min(8,4)=4;所以应该偏移量为4,所以应该在char后面加上三个字节,不存放任何东西,short占两个字节,min(8,2)=2;所以偏移量是2的倍数,而short偏移量是8,是2的倍数,所以无需添加任何字节,所以第一个规则对齐之后内存状态为0xxx|0000|00
- 此时一共占了10个字节,但是还有结构体本身的对齐,min(8,4)=4;所以总体应该是4的倍数,所以还需要添加两个字节在最后面,所以内存存储状态变为了 0xxx|0000|00xx,一共占据了12个字节