深度探索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; }
相关文章推荐
- 工程脚本插件方案 - c集成Python基础篇(VC++嵌入Python)
- 《C++语言基础》程序阅读——指针、const、static(二)
- C++标准库中正则表达式简介
- C语言中的位操作
- 七大排序算法C++实现(代码分享)
- C++中rdbuf()简介及文件流的概念
- C++实现目录下所有文件添加后缀名
- ACM:蓝桥杯:成绩转换(switch用法)
- C语言中几个常用输入函数的异同点
- C++复习2.拷贝构造函数
- 关于map和unordered_map还需要知道的
- constructor and destructor 概述
- 浅谈C++中指针和引用的区别
- 书上例题 格子游戏
- C++虚函数表解析
- C++ const
- C++ sizeof关键字的使用总结
- c++点滴
- C++走向远洋——67(项目二、洗牌)
- C++复习1.const用法