C++类的相关知识
C中的结构体计算规则:
原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
原则4、如果结构体中嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小
就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
空类的大小
C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的。
C++引入类的概念:
1.类中可以定义函数;
2.类的声明和定义可以在不同文件;
3.类中含有作用域的权限[封装];
说明:
1、类定义了一种新类型,是抽象出来描述实体的。
2、类将一组具有相关性数据包装在一体,这些数据称为类的成员变量或属性;类对自己的数据有特定的操作,这些操作称为 类的成员函数或方法。
3、类定义了一种新作用域,它可以选择性的将自己的成员提供给使用者(访问限定符)。
4、类中的任何成员都不能使用auto、extern、register修饰
5、一个类可以有多个成员,类的成员函数可以重载
面向对象四大特性:抽象、继承、封装、多态;
C++的三大特性:继承,封装,多态;
封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。函数是封装的一种形式:函数所执行的细节行为被封装在函数本身这个更大的实体中,被封装的实体隐藏了它们的实现细节---可以调用一个函数但是不能够访问函数所执行的语句。
1、public成员在类外可以直接访问
2、protected和private成员在类外(在此可将protected和private理解成private) 不能够访问。
3、它们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
4、class的默认访问权限是private,而struct为public型(因为struct要兼容C)。
Q:类外如何访问类内部的私有成员变量
1.通过get/set函数;
2.通过类内函数的参数传值(外带参数):指针或引用;
3.friend有元;
多态:这种由于派生类重写基类方法,然后用基类引用指向派生类对象,调用方法时候会进行动态绑定,这就是多态。
构造函数能否设置成虚函数:构造函数的作用我们都知道,是创建对象的,而虚函数的调用是通过对象来进行的,这是矛盾的,所以说构造函数不能声明成虚函数。
静态函数能否设置虚函数:如果定义成静态成员函数,那么在这个函数可以通过类名和域作用符来调用,也就是说,不用创建对象就可以调用。虚表地址的使用必须通过对象的地址才能获取。
类的作用域:
成员变量在类中具有全局作用域。