1.类及对象
约定:
首先单纯的声明一个类A ,如果A没有被实例化,那么A是不会占用内存空间。这里的类可以理解为一种特殊数据结构类型。
对象:一个类实例化后就变成一个对象,且对象活跃在内存中,所以类被实例化,本质也是在内存中开辟一段空间来存储类,这段内存空间就叫对象。
那么一个对象被实例化之后,会申请多大的内存空间了?多大的空间取决与这个对象对应的类包含哪些数据,即对象的大小是它的数据成员所占存储空间之和,就和结构体一样
1.1 :这个类是空类
#include<iostream.h>
using namespace std;
class A {
};
int main() {
A a;
cout << "size of a 内存字节大小=" << sizeof(a) << endl;
cout << "size of a 地址为:" << &a << endl;
}
打印结果:
size of a 内存字节大小=1
size of a 地址为:00000065C07BF944
结论:一个空类存的实例 会分配 一个字节内存大小
原因:记着把一个空类 实例化时 就会分配一字节
文献: To ensure that the addresses of two different objects will be different.” 就用那1byte来在内存中占用不同地址了。又因为这些空class没有赋值的意义,所以就没必要占用更多内存
1.2 : 有一个成员函数
class A {
public:
int fun() {
return 0;
}
};
int main() {
A b;
cout << "size of b 对象b分配的内存大小=" << sizeof(b) << endl;
cout << "size of b 对象b分配的内存地址=" << &b << endl;
}
结果 :
size of b 对象b分配的内存大小=1
size of b 对象b分配的内存地址=0000006F1B6FF6E4
结论: 在一个类中定义一个函数,这个类实例化后,不分配内存空间
因为类中定义的函数,不能算作对象的成员,因此不能再对象的存储空间内。
1.3 : 有一个虚函数
class A {
// 定义打印的虚函数
public:
virtual void print() {
cout << "This is A" << endl;
}
};
int main() {
A b;
cout << "size of b 对象b分配的内存大小=" << sizeof(b) << endl;
cout << "size of b 对象b分配的内存地址=" << &b << endl;
}
结果:
size of b 对象b分配的内存大小=8
size of b 对象b分配的内存地址=0000009C170FF818
结论:
1:虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的。
2:如果在 64位操作系统中,需要占用8个字节。
1.4 这个类存在成员变量和静态变量
class A {
private:
int data;
static int data1;
};
int main() {
A b;
cout << "size of b 对象b分配的内存大小=" << sizeof(b) << endl;
cout << "size of b 对象b分配的内存地址=" << &b << endl;
}
结果:
size of b 对象b分配的内存大小=4
size of b 对象b分配的内存地址=000000FAB43CF764
结论:
类中的静态成员变量不占类的内存;
并且静态成员变量的初始化必须在类外初始化