对象封装

C++与C语言最大的区别在于C++提供了对抽象数据的封装支持,在C语言中,常见的做法是定义struct,然后使用在struct外部定义的方法操作struct中的数据,这种做法剥离了数据与方法之间的联系,不利于保持程序结构的清晰与一致性。C++将结构体的概念扩展为“对象”,使之支持成员函数与继承。初看起来C++对象的概念比C结构体臃肿,实际上现代编译器采取了一系列优化方式降低封装对内存的额外消耗。

C++对象模型

在C++对象中有两种成员变量:static和nonstatic以及三种成员函数:static、nonstatic和virtual。对于不同的成员,在内存中的布局形式可以有多种形式,以下举例说明:

1
2
3
4
5
6
7
8
9
10
11
class Point
{
private:
float m_x,m_y;
static int m_Count;

public:
virtual void Show();
float X();
static int Count();
}

简单布局模型:针对对象中的每一个成员,都分配一个指针指向它。这种布局方式的对象大小与成员类型无关,只与成员数量有关,若对象的成员很多,将会消耗大量内存,因此编译器未使用这种布局方式构造对象,但将其使用在成员指针中。
表格模型:这种方式将成员变量与成员函数分开安排在两个表,再在对象内部设置两个指针分别指向这两个表。编译器同样未使用这种布局,但将其用在构建虚函数表。
C++的对象模型综合了以上两种方案,对于成员变量,将nonstatic直接放置到对象内部(非指针),static则放置到对象外部。对于成员函数,无论是static还是nonstatic都放在对象外部,对virtual函数则特殊处理:首先将对象的虚函数提取出来构建虚函数表,然后在对象内部放置一个指向虚函数表的指针

 评论




载入天数...载入时分秒...  |  总访问量为
Powered by Github and MarkdownPad 2

--------------------------- 别拉了,我是有底线的>_< ---------------------------