Object Lessons 关于对象

在C语言中,“数据”和“处理数据的操作(函数)”是分开声明的,也就是说 ,语言本身并没有支持“数据和函数”之间的关联性。把这种程序方法称为程序性(procedural),由一组“分布在各个以功能为导向的函数中”的算法所驱动,它们处理的是共同的外部数据。

 1 typedef struct point3d
2 {
3 float x;
4 float y;
5 float z;
6
7 }Point3d;
8
9 //打印一个Point3d,就需要定义一个这样的函数
10 void Point3d_print(const Point3d *pd)
11 {
12 printf("(%g, %g, %g)", pd->x, pd->y, pd->z);
13 }
14 //为了效率高点,可以定义成宏
15 #define Point3d_print( pd ) \
16 printf("(%g, %g, %g)", pd->x, pd->y, pd->z);
17
18 //更直接的是直接在一个程序中完成操作
19 void my_foo()
20 {
21 Point3d *pd = get_a_point();
22 ....
23 /* 直接打印出 point .... */
24 printf("(%g, %g, %g)", pd->x, pd->y, pd->z);
25 }
26
27 //对于某个点的坐标可以直接存取
28 Point3d pt;
29 pt.x = 0.0;
30 // 或者直接定一个处理宏
31 #define X(p, xval) (p.x) = (xval)
32 ...
33 X(pt, 0.0);

在C++中, Point3d采用“抽象数据类型(abstract data type, ADT)”来实现:

 1 class Point3d
2 {
3 friend ostream& operator<<(ostream &os, const Point3d &pt);
4 public:
5 Point3d(float x = 0.0, float y = 0.0, float z = 0.0)
6 :_x(x), _y(y), _z(z){}
7
8 float x() const { return _x; }
9 float y() const { return _y; }
10 float z() const { return _z; }
11
12 void x(float xval ) { _x = xval; }
13 void y(float yval ) { _y = yval; }
14 void z(float zval ) { _z = zval; }
15
16 private:
17 float _x;
18 float _y;
19 float _z;
20 };
21 inline ostream& operator<<(ostream &os, const Point3d &pt)
22 {
23 os << "(" << pt.x() << "," << pt.y() << "," << pt.z() << ")";
24 };

或者一个双层或者三层clasa层结构完成

 1 class Point {
2 public:
3 Point(float x = 0.0): _x(x) {}
4
5 float x() const { return _x; }
6
7 void x(float xval) { _x = xval; }
8 protected;
9 float _x;
10 };
11
12 class Point2d : public Point
13 {
14 public:
15 Point2d(float x = 0.0, float y = 0.0)
16 :Point(x), _y(y) {}
17
18 float y() { return _y; }
19
20 void y(float yval) { _y = yval; }
21 protected:
22 float _y;
23 };
24
25 class Point3d: public Point2d
26 {
27 public:
28 Point3d(float x = 0.0, float y = 0.0, float z = 0.0)
29 : Point2d(x, y), _z(z) {}
30
31 float z() { return _z; }
32
33 void z( float zval) { _z = zval; }
34 protected:
35 float _z;
36 }
37
38 template< class T>
39 class Point3d
40 {
41 public:
42 Point3d(T x = 0.0, T y = 0.0, T z = 0.0)
43 : _x(x), _y(y),_z(z) {}
44
45 T x() const { return _x; }
46 T y() const { return _y; }
47 T z() const { return _z; }
48
49 void x(T xval ) { _x = xval; }
50 void y(T yval ) { _y = yval; }
51 void z(T zval ) { _z = zval; }
52
53 private:
54 T _x, _y, _z;
55 };
56
57 template<class T, int dim>
58 class Point
59 {
60 public:
61 Point();
62 Point(T coords[dim]) {
63 for (int index = 0; index < dim; index++)
64 _coords[index] = coords[index];
65 }
66
67 T& operator[] (int index){
68 assert(index < dim && index >= 0);
69 return _coords[index];
70 }
71
72 T operator[] (index) const {
73 assert(index < dim && index >= 0);
74 return _coords[index];
75 }
76
77 // ... etc
78 private:
79 T _coords[dim];
80 };
81
82 inline
83 template <class T, int dim>
84 ostream & operator<<(ostream &os, const Point<T, dim> &pt)
85 {
86 os << "(";
87 for (int ix = 0; ix < dim - 1; ix++)
88 os << pt[ix] << ", ";
89 os << pt[dim - 1];
90 os << ")";
91 }

从软件工程的眼光来看,为什么“一个ADT或class hierarchy的数据封装”比“在C程序中程序性地使用全局数据”好。

加上封装后的布局成本(layout costs for adding Encapsulation)

增加封装后,布局成本增加了多少?答案是 class Point3d并没有增加多少成本。三个data membeers 直接内含在一个class objects之中,就像C struct 的情况一样。而member function虽然含在class的声明之内,却不出现在object之中。 每一个non-inline member function只会诞生一个函数实例。至于每一个“拥有零个或一个定义的”的inline function 则会在其每一个使用者(模块)身上产生一个函数实例。

C++在布局以及存取时间上主要的额外负担是由virtual引起的, 包括;

  • Virtual function 机制,用以支持一个有效的“执行期绑定”(runtime binding)

  • Virtual base class 用以实现“多次出现在继承体系中的base class, 有一个单一而被共享的实例“

  • 多重继承下的额外负担, 发生在“一个derived class 和其第二或后继之后base class 的转换”之间。

一般,没有什么天生的理由说C++程序一定比其C程序庞大或迟缓。

深入探索C++对象模型(Inside the C++ object model) -- 摘阅笔记(关于对象 - esp 1)的更多相关文章

  1. 认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法。元素、属性和文本的树结构(节点树)。

    认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码 ...

  2. Inside The C++ Object Model(三)

    ============================================================================3-0. 类所占的内存大小受到三个因素的影响:( ...

  3. 浏览器对象模型BOM(Browser Object Model)

    1.结构 BOM是Browser Object Model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是w ...

  4. C++学习书籍推荐《Inside the C++ Object Model》下载

    百度云及其他网盘下载地址:点我 作者简介 Stanley B. Lippman is Architect with the Visual C++ development team at Microso ...

  5. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...

  6. Inside The C++ Object Model - 04 C++对象模型的一个简单示例

    首先定义一个类X class X { public: X(); X(const X& x); virtual ~X(); virtual foo(); } 再来一段代码: X foobar() ...

  7. inside the C++ Object model总结

    一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中 ...

  8. Inside The C++ Object Model - 03

    object Lessons 1.C++中布局以及存取时间上的的额外负担是由virtual引起的:virtual function.virtual base class.或是由于多继承引起的. 2.C ...

  9. Inside The C++ Object Model(一)

    ============================================================================1-1. 关键字struct和class的一点区 ...

  10. Inside The C++ Object Model - 02

    前言 - 什么是C++对象模型 C++对象模型包括2个方面的含义: 1.语言中直接支持面向对象程序设计的部分 2.对于各种(面向对象)支持的底层实现机制. 无论是什么语言,都需要转换为汇编.很多面向对 ...

随机推荐

  1. 好饭不怕晚,Google基于人工智能AI大语言对话模型Bard测试和API调用(Python3.10)

    谷歌(Google)作为开源过著名深度学习框架Tensorflow的超级大厂,是人工智能领域一股不可忽视的中坚力量,旗下新产品Bard已经公布测试了一段时间,毁誉参半,很多人把Google的Bard和 ...

  2. 二进制安装Kubernetes(k8s) v1.23.5

    Github:https://github.com/cby-chen/Kubernetes/releases 前提说明:公主号不支持富文本,建议在Github查看. 1.23.3 和 1.23.4 和 ...

  3. day8:列表相关函数&深浅拷贝&字典相关函数&集合相关操作/函数

    字符串/列表/字典/集合 目录 字符串相关操作: 拼接 重复 跨行拼接 索引 切片字符串相关函数:常规11+is系列3+填充去除6+最重要3字符串拓展:字符串的格式化format 列表的相关操作:拼接 ...

  4. c++基本数据结构

    基本数据结构: 一.线性表 1.顺序结构 线性表可以用普通的一维数组存储. 你可以让线性表可以完成以下操作(代码实现很简单,这里不再赘述): 返回元素个数. 判断线性表是否为空. 得到位置为p的元素. ...

  5. C# List转SqlServer、MySql中in字符串

    var oneList = new List<string> { "1", "2", "3" }; var oneString ...

  6. 获取网络连接状态(二) IsNetworkAlive

    IsNetworkAlive需要服务System Event Notification的支持(系统默认自动启动该服务),且需要安装最新的SDK(如.NET) 浏览:MSDN对IsNetworkAliv ...

  7. Prism Sample 7 Modules Directory

    这种方式用扫描目录的方式来增加模块,具备最大的灵活性 仍然在App.xaml.cs中增加了以下代码 protected override IModuleCatalog CreateModuleCata ...

  8. 企名片Js逆向思路

    企名片Js逆向思路 这个案例不算难,简单说一下思路. 目标链接:https://www.qimingpian.cn/finosda/project/pinvestment 网站更新了https://w ...

  9. 2022-05-12:小歪每次会给你两个字符串: 笔记s1和关键词s2,请你写一个函数, 判断s2的排列之一是否是s1的子串。 如果是,返回true; 否则,返回false。 来自字节飞书团队。

    2022-05-12:小歪每次会给你两个字符串: 笔记s1和关键词s2,请你写一个函数, 判断s2的排列之一是否是s1的子串. 如果是,返回true: 否则,返回false. 来自字节飞书团队. 答案 ...

  10. Selenium - 基础知识介绍

    Selenium - 基础知识介绍 介绍 Selenium是ThoughtWorks员工在业余时间开发并维护的开源项目,并且在ThoughtWorks的项 目中被广泛应用. 简单地说,Selenium ...