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;
}