您的位置:首页 > 编程语言 > C语言/C++

深度探索C++对象模型--关于对象

2016-06-10 04:26 465 查看

C++关于对象

C++的class ADT相比C struct在布局上成本的额外负担是由virtual引起的:virtual function(用于支持动态绑定),virtual base class(用于实现“多次出现在集成体系中的base class,有一个单一而被共享的实例”)。

1.1C++对象模式

class Point{
public:
Point(float xval);
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream&
print(ostream &os) const;
float _x;
static int _point_count;
};


简单对象模型

成员本身并不放在对象中,只有指向成员的指针才放在对象内,这样可以避免成员有不同的类型,因而需要补同的存储空间所带来的问题。

对象中的成员是以slot(表格中的一格)的索引值来寻址的。

简单对象模型中的索引或slot个数的概念被应用到C++的“指向成员的指针”概念中。



表格驱动对象模型

把所有与成员相关的信息抽出来,放在数据成员表和一个成员函数表中。类对象本身则内含指向这两个表格的指针。成员函数表示一系列的slot,每个slot指出一个成员函数;数据成员表则直接持有数据本身。



C++对象模型

非静态数据成员被配置于每一个类对象之类,静态数据成员则被存放在个别的类对象之外。静态和非静态成员函数也被放在个别的类对象之外。

virtual function由两个步骤支持:

每个对象产生一些指向虚函数的指针,放在虚表(vtbl)中。

每个对象都有一个指针指向相关的虚表(vptr)。vptr的设定和重置都由每一个类的构函数、析构函数、拷贝赋值运算符自动完成。每个类所关联的type_info object(用于支持Runtime type identification RTTI)也经由虚表被指出了,通常放在vtbl的第一个slot。



#include <iostream>
using namespace std;
class Point
{
public:
Point(int xval)
{
_x = xval;
_point_count++;
cout << "Point(int xval)" << endl;
}
virtual ~Point(){}
static int PointCount()
{
cout << "PointCount" << endl;
return _point_count;
}
int x() const
{
cout << "float Point::x() const" << endl;
return _point_count;
}
protected:
virtual ostream&
print(ostream &os) const
{
return os;
}
int _x;
static int _point_count;
};
int Point::_point_count = 0;
int main()
{
Point pt(1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: