1、C/C++区别

  C++较之C的最大区别,无疑在于面向对象,C程序中程序性地使用全局数据。而C++采用ADT(abstract data tpye)或class hierarchy的数据封装。类相较于C的struct不仅只包含了数据,同时还包括了对于数据的操作。在语言层面上C++带来了很多面向对象的新特性,类、继承、多态等等。新特性使得C++更加强大,但同时却伴随着空间布局和存取时间的额外成本。这些额外成本主要由 virtual引起,包括:

  • virtual function 机制,用来支持“执行期绑定”。
  • virtual base class ——虚基类机制,以实现共享虚基类的 subobject。

除此之外C++没有太多理由比C迟缓。

2、C++对象模式

  C++中有两种class data members:static、nostatic,以及三种class member functions:static、nonstatic 和virtual。

  • nonstatic data members被配置于每一个class object之内;
  • static data members则被存在在所有calss object之外;
  • static和 non static function members也被放在所有class object之外。

  virtual function则以两个步骤支持:

  (1)virtual table(vtbl):每个class 产生出一堆指向virtual functions的指针,放在该表格内。

  (2)vptr:每个class object 被添加一个指向相关virtual table的指针。vptr的设定和重置都由每个class 的constructor、destructor和copy assignment运算符自动完成。每个class所相关的type_info object(用以支持runtime type identification)也经由virtual table被指出来,通常放在表格第一个slot处。

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Point
  5. {
  6. public:
  7. Point (float xval);
  8. virtual ~Point();
  9. float x() const;
  10. static int PointCount();
  11. protected:
  12. virtual ostream& print(ostream &os) const;
  13.  
  14. float _x;
  15. static int _point_count;
  16. };  

可以发现:

  (1)float _x;被放在class Point之内。

  (2)static int _point_count; Point (float xval); float x() const;static int PointCount();不在class Point之内,即放在所有class object外面。

  (3)virtual table有两项,表示 virtual ~Point();virtual ostream& print(ostream &os) const;

  (4)VS编译器添加了指向相关virtual table的指针vfptr放在class object中,位置在data members的前面。

3、继承

  C++继承包括了单一继承、多重继承、虚继承三种继承。

3.1 可能的模型:

  (1)简单对象模型:derived class object(派生类)内的一个slot指出每一个base class (该slot内含base class subobject的地址)。优点是derived class object的大小不会因base classes的改变而受到影响。缺点是因为间接性而导致空间和存取时间上的额外负担。

  (2)base table模型:很像virtual table 内含每一个virtual function的地址,base class table的每一个slot含有一个相关的base class地址。每一个class object内含有一个bptr,被初始化后指向其base class table。

不管采用那种模型,“间接性”的级数都将因为继承的深度而增加。

  3.2 单一继承、多重继承

C++最初采用的继承模型并不运用任何间接性:即base class subobject的data members被直接放在derived class object中。这(直接复制模型)提供了对base class 最紧凑而最有效率的存取。缺点是base class members的任何改变后,所有用到此base class或其derived class的objects者必须重新编译。

  3.3 虚继承

那么对于C++2.0新加入的virtual base class呢?

需要一些间接性的base class表现方法。其原始模型是在class object中为每一个有关联的virtual base class 加上一个指针。其他演化的模型则若不是导入一个virtual base class table,就是扩充原来已经存在的virtual table,以便维护每一个virtual base class的位置。

  总结:

对于单一继承、多重继承采用直接复制模型,对于虚继承则(在直接复制模型的基础上)选择两种间接性模型之一。

那么VS编译器选择哪种继承模型呢?

答案是:virtual base class table模型

  注:在虚继承的情况下,base class不管在继承串链中被派生多少次,永远只会存在一个实体(subobject)。

4、对象的差异

  4.1 编程范式:

C++程序设计模型直接支持三种programming paradigms(编程范式):

  (1)程序模型(procedural model):与C一致;

  (2)抽象数据类型(abstract data type model,ADT):抽象数据类型是与表示无关的数据类型,是一个数据模型及定义在该模型上的一组运算;其处理的是一个拥有固定而单一的类型的实体,在编译时期就已经完全定义好了。

  (3)面向对象模型(object-oriented model):在此模型中有些彼此相关的类型,通过一个抽象的base class(用以提供公共接口)被封装起来。原则上,被指定的object的真实类型在每一个特定执行点之前无法解析。在C++中,只有通过pointer和reference才能够完成。

在需要多态时,对一个base class object,只有通过pointer或reference的间接处理,才支持OO程序设计所需的多态性质。

  4.2 C++支持多态的方法

  (1)经由一组隐含的转换操作。

  (2)经由virtual function机制。

  (3)经由dynamic_cast和typeid运算符。

  4.3 多态的主要用途

经由一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的base class中。这个共享接口是以virtual function机制引发的,它可以在执行期根据object的真正类型解析到底是哪一个函数实体被调用。

5、类内存大小计算方法

  5.1 一个类的对象的内存大小包括:

  • 所有非静态数据成员的大小。
  • 由内存对齐而填补的内存大小。
  • 为了支持virtual有内部产生的额外负担

如下:

  1. class ZooAnimal {
  2. public:
  3. ZooAnimal();
  4. virtual ~ZooAnimal();
  5. virtual void rotate();
  6. protected:
  7. int loc;
  8. String name;
  9. };

  在32位计算机上所占内存为16字节:int四字节,String8字节(一个表示长度的整形,一个 指向字符串的指针),以及一个指向虚函数表的指针vptr。对于继承类则为基类的内存大小 加上本身数据成员的大小。在cfront中其内存布局如下图:

【C++对象模型】第一章 关于对象的更多相关文章

  1. 《深度探索C++对象模型》第一章 | 关于对象

    C++对象模式 非静态数据成员放置在每个类对象内,静态数据成员则被放置在所有类对象之外.静态和非静态的成员函数也被放置在所有类对象之外.每个类产生一堆指向虚函数的指针,放在虚表(vtbl)中.每个类对 ...

  2. 深度探索c++对象模型 第一章

    1,声明与定义. //声明式如下: extern int x;   //对象式(变量式)声明 std::size_t numDigits(int number);  //函数式声明 class Wid ...

  3. C++对象模型——关于对象(第一章)

    第一章    关于对象 在C语言中,"数据"和"处理数据的操作(函数)"是分开声明的,也就是说,语言本身并没有支持"数据和函数"之间的关联性 ...

  4. 【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)

    前言中的内容: 1.什么是C++对象模型? 1.语言中直接支持面向对象程序设计的部分 2. 对于各种支持的底层实现机制 2. C++ class的完整virtual functions在编译时期就固定 ...

  5. 18第一章 ASP.Net内建对象

    第一章        ASP.Net内建对象 第一章        ASP.Net内建对象 ASP.Net为保持用户的数据和信息,内建了许多对象,包括Application.Response.Requ ...

  6. 20190813 On Java8 第一章 对象的概念

    第一章 对象的概念 抽象 Alan Kay 总结了对象的五大基本特征 万物皆对象. 程序是一组对象,通过消息传递来告知彼此该做什么. 每个对象都有自己的存储空间,可容纳其他对象. 每个对象都有一种类型 ...

  7. [Java编程思想] 第一章 对象导论

    第一章 对象导论 "我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来--除非赞成这个协定中规定的有 ...

  8. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  9. 第一章 数据库概述、MySQL的安装和配置

      第一章 数据库概述.MySQL的安装和配置   1.为什么要使用数据库 最早是纸质文件来存储数据 缺点:不易保存,占用空间大 计算机出现以后,采用软件来进行保存(excel) 缺点:容易损坏 文件 ...

随机推荐

  1. 【转】再谈PHP、Python与Ruby

    原文链接:http://www.nowamagic.net/librarys/veda/detail/2504 一句话总结 简单地总结: 假如你想帮他尽快找个活儿,赚到钱,推荐PHP. 假如你想让他成 ...

  2. c#数据库乱码

    1.sql连接语句加charset=utf8: 2.不要使用odbcConnection. 在由utf8改为latin1时候,需要修改的地方: 1.连接数据库语句中的charset: 2.在sql语句 ...

  3. 软件工程课堂作业(三)——Right-BICEP软件单元测试

    一.测试方法:Right-BICEP Right-结果是否正确?B-是否所有的边界条件都是正确的?I-能查一下反向关联吗?C-能用其他手段交叉检查一下结果吗?E-你是否可以强制错误条件发生?P-是否满 ...

  4. Calculation PartⅡ

    GitHub/object-oriented 误删内容--周末修复

  5. 将MathType公式转换为LaTex格式

    LaTex编辑公式不够直观,常常会因为结构复杂导致数据或者符号出错,使用MathType编辑公式后再直接转换成LaTex代码可以避免这个问题. 一.首先在MathType中编辑公式 二.然后点击参数— ...

  6. PHPcms企业黄页中,会员注册之后提示经营模式不得少于1个字符 的解决办法

    后台--模块- 黄页模块 ---  企业库 --- 字段 ---   经营模式 ---  字符长度取值范围 1  改为  0. 

  7. volatile并不能保证数据同步、只能保证读取到最新主内存数据

    在 java 垃圾回收整理一文中,描述了jvm运行时刻内存的分配.其中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈, 线程栈保存了线程运行时候变量值信息.当线程访问某一个对象时候值的 ...

  8. Luogu1092 NOIP2004虫食算(搜索+高斯消元)

    暴力枚举每一位是否进位,然后就可以高斯消元解出方程了.然而复杂度是O(2nn3),相当不靠谱. 考虑优化.注意到某一位进位情况的变化只会影响到方程的常数项,于是可以在最开始做一次高斯消元算出每个未知数 ...

  9. 51nod 1304 字符串的相似度(exkmp)

    拓展kmp裸题 自己跟自己匹配即可 模板测试=v= #include <iostream> #include <cstring> using namespace std; ; ...

  10. Andorid API Package ---> android

    包名: android                                                        Added in API level 1  URL:http:// ...