什么是面向对象
面向对象程序设计(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例,将对象作为程序的基本单元,将程序和数据
封装其中,以提高软件的重用性,灵活性和扩展性。
面向对象三大特征:封装,继承,多态。
一个类(class/struct)中包含数据(成员变量)和程序(成员函数)
三种访问限定符
public 公有 protected保护 private私有
1.public成员可以从类外部直接访问,private/protected成员不能从类外部直接访问。
2.每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
3.类体中如果没有定义限定符,则默认为私有。
4.类的访问限定符体现了面向对象的封装性。
作用域
作用域有:局部域,全局域,类域,名字空间域。
类的作用域:
1.每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其他成员函数。
2.对象可以通过.直接访问公有成员,指向对象的指针通过->也可以直接访问对象的公有成员。
3.在类外面定义成员,需要使用::作用域解析符来说明成员属于哪个作用域。
2.类的大小?为什么要内存对齐?内存对齐的计算?空类的计算
类的大小:只计算成员变量,不计算成员函数。
类大小的计算方法其实和学过的结构体大小的计算方法及其类似,都遵循同一个规则:内存对齐原则。为什么要进行内存对齐呢?
(1)内存对齐主要作用
①平台原因(移植原因)
a.不是所有的硬件平台都能访问任意地址上的任意数据。
b.某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出异常
②性能原因
a.数据结构(尤其是栈)应该尽可能的在自然边界上对其。
b.原因在于,为了访问未对齐的内存,处理器需要做俩次内存访问;而对齐的内存访问仅需要一次访问。
内存对齐是一种以空间换时间的方法。
(2)内存对齐的计算
结构体内存对齐规则:
1.第一个成员在与结构体变量偏移量为0的地址处。(第一个成员也有对齐数)
2.其他成员要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值 windows平台的默认对齐数是8,Linux的默认对齐数是4
3.结构体总大小为最大对齐数(每一个成员变量除了第一个成员变量都有一个对齐数)的整数倍 。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处, 结构体的整体大小就是所有最大对齐数(含嵌套结构体的对其数)的整数倍。
class A
{
char c;
double d;
};
class B
{
char ch1;
A a;
char ch2;
};
计算类A与B的大小:
A类:类中第一个成员在与结构体变量偏移量为0的地址处,所以c可直接放置,大小为1。第二个成员变量大小为8,而windows默认的下的对齐数是也是8,所以大小与默认对齐数较小的还是8。最终第二个成员变量需要对齐到8的整数倍的地址处,因此在第一个成员变量的地址处之后需要后移7个字节才可以放置变量d;由规则3:类的最大对齐数是8,因此类的总大小得是8的整数倍。所以类A的大小:1+7+8 = 16
类B:不难发现类B是一个嵌套了类的情况。第一个成员变量ch1放置在与结构体变量偏移量为0的地址处,大小为1。第二个就是嵌套的类A,类A大小已知是16,最大对齐数是8,需要向后偏移7个字节。第3个成员变量是一个char类型的变量不需要偏移。所以理论上B的大小是1+7+16+1=25;但实际上还受到第三条规则的限制,因为类的最大对齐数是8,所以总大小为32.
空类的大小:空类也有大小大小为1,空类有大小是为了占位,证明这个空类存在过。
class C
{
void show()
{}
}; //这是一个空类