1.什么是对象
对象的引入(类的实例化)
在C++面向对象这门语言中,不仅需要类这种将所有相同事物合并在一起的结构,还需要针对于这个空壳(类)进行创建对象(实例化对象),创建出一个一个的具有这种类属性和方法的单位,就叫做对象。
class People
{
public:
int a;
char b;
};
int main()
{
People p1;//p为people类的对象,具有类中的属性和方法
People p2;
People* pp = p2;//pp为对象指针
return 0;
}
对象的作用
当用户创建出众多的对象之后,肯定是需要这一批对象来帮助自己完成一系列的任务,所以,就有了许多的相同类型的对象,比如说创建的people类,中可以有姓名为张三/李四等等相同属性和相同方法的对象。
2.类对象模型(重点)
如何计算类的大小
一道经典的类对象大小计算问题
class T1
{
char _c;
int _b;
double _a;
};
class T2
{
char _c;
double _a;
int _b;
};
int main()
{
cout << "T1 size is :" << sizeof(T1) << endl;
cout << "T2 size is :" << sizeof(T2) << endl;
return 0;
}
//answer:T1 size is : 16
// T2 size is : 24
我们可以发现,类对象进行大小计算时,在类中定义相同的变量不同的顺序最终计算出来的类对象的大小竟然不一样,在此,我们展开对此进行研究。
首先我们来讨论一下内存对齐(暂时不考虑虚函数例子(后面的博客会针对于虚函数再做内存对齐讲解))
1.概念
在类对象中成员变量在内存中的布局形式,如上述类成员布局格式如下图所示
T1类对象模型
其中:截图中是以16进制进行编码,所以
_c占用四个字节为63,_b占用四个字节为1,_a占用八个字节为0.1 ,总占用字节数为16
T2类对象模型
其中:_c占用八个字节为63,_b占用八个字节为1,_a占用八个字节为0.1 ,总占用字节数为24
类对象模型对齐规则
- 类中的每个元素都是从上至下(按照顺序)放入内存的。
- 每个元素放入内存时,都会以自身类型大小为单位来划分存储单元,所以每一个元素放置的位置一定是从首地址的整数倍的位置开始存储。(char,double,int中,char存放一个字节,但是double存放以自身为中心,所以他需要让char的内存对齐,偏移量为7个字节,double从第9个字节开始存储,int存放为从第17个字节开始,存放四个字节)
- 在放置完成后,会进行检查总容量是否为最长元素的整数倍,如果不是,则会进行内存补齐,所以最终大小一定为最长元素的整数倍(接2中的例子,int存放到20即可,但是需要进行内存补齐,所以,在int后又加了4个字节进行补齐)
- 左图为 char int double
右图为char、double、int
3.类对象调用成员函数法则
虚函数、普通函数在编译完成后,会将这些函数放入【代码区】,当调用函数名时,普通成员函数的函数名也是一个指针会指向代码段的该函数,共CPU进行处理,虚函数则通过虚表指针进行访问(在此笔者不做细讲)
//根据上面people类进行调用格式讲解
int main()
{
People p;
p.func1();//可以调用类中的public成员函数func1
p._name;//如果成员变量为public,则对象p可以顺利调用自身的变量_name
return 0;
}
调用规则一般是通过对象名称+. 的形式来调用,当然也可以使用指针指向来进行调用。