成员函数的存储方式
用类去定义一个对象时,系统会为每一个对象分配存储空间,如果一个类包括了成员函数和数据成员的话
按道理来讲,要分别为数据和函数代码分配存储空间。如果我们用myclass这个类定义了5个对象,那么是
否为每一个对象的数据和函数代码分别分配存储单元,并将他们”封装“在一起呢?
经过分析可以知道,同一类的不同对象中的数据成员的值一般是不相同的,而不同对象的函数的代码是相
同的,不论调用哪一个对象的函数代码,其实调用的都是同样的代码。既然是这样,在内存中开辟5段空间
来存储这个5个对象的数据和函数代码是没有必要的。
下面是先前所设想的逻辑模型和实际的内存模型;
设想的成员函数存储模型
实际的成员函数存储模型
当用图说明不了什么问题下面的例子可以很清楚的说明这个问题:
#include <iostream>
using namespace std;
class myclass
{
private:
int a,b;
public:
void display() //这段系统会设置成内置成员函数;
{
cout<<”a:”<<a<<endl
<<”b:”<<b<<endl;
return 0;
}
}
int main()
{
cout<<sizeof(myclass)<<endl;
return 0;
}
//最后输出的值是:8;因为一个int型在内存中占4个字节,可以看到一个对象的大小取决于该对象数据成员所占用的空间,而与成员函数是没有关系的;
而成员函数是存储在类外的,那么可能有这样的一个问题,就是我们如果定义了5个myclass对象的话,那么我们用my2.display();输出的是my2的数据成员的相关数据,那么系统怎么知道的什么时候调用哪个,要知道如果我们通过引用来调用类中的数据成员和成员函数实际上是通过指针来实现的,在我们所定义的五上对象当中都有一个this指针,指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址;