浅析C++对象模型问题

开发 后端
既然我们选择了C++对象模型而不是C作为开发工具,那我们的编程思想也应该转为C++的,而不能再延续C的Procedural方式。

在C++编程过程中,Class类型一旦被定义,它的实例对象就能被创建,并初始化,且能定义指针变量指向它,换句话说实例化的类就是对象,好了,下面就随本文带大家进入C++对象模型的知识海洋吧。

C++对象模型的思维方式解决问题,对于对C语言已经很熟悉的人来说会很不能适应。需要一段时间来适应,不然会将代码写的似是而非。而且不能邯郸学步,必须从思想上彻底的C++(OO),如果只是依葫芦画瓢,那结果很可能是用C++的语法编写C式的程序。

本人曾经犯的典型的低级的错误之一,就是无意识的一个类无限制的扩充,完全没有考虑到类的多层结构(基类-派生类),需要属性或方法便在类中增加,虽然也用到了多态、重载等一些OO的设计方式,但***这个类庞大无比,除了在当前系统中任劳任怨的工作外,一点复用的可能都没有,如果另一个系统还需要一个类似的东西,那只能重新设计实现一个新的类。

并且最致命的是在维护更新时带来得麻烦,需要不断全部编译不说,而且代码在用了大量注释后,在过一段时间读起来也是一件重脑力劳动。及失去了C的简洁清晰和高效,也不完全具备C++的面向对象的特性。

这根本不能叫C++程序。(我想有时间重写一下以前代码也会有很多收获,温故而知新吗)C和C++在编程思想上是相互矛盾的。这也就是说如果你想学C++,完全可以不学C,只需要一本好书和一个不太笨的大脑再加上努力就可以了,如果你已有C的经验在一定的情况下反而会捣乱。#t#

本章是对对象模型的一个大略浏览。既然我们选择了C++对象模型而不是C作为开发工具,那我们的编程思想也应该转为C++的,而不能再延续C的Procedural方式。我们必须学会C++的思考方式。采用抽象数据类型或用一个多层的class体系对数据以及数据处理函数进行封装,只有摆脱C程序的使用全局数据的惯性,才能充分发挥出C++对象模型的强大威力。

在C++中有两种数据成员static和nonstatic,以及三种成员函数static、nonstatic和virtual。C++对象模型对内存空间和存取时间做了优化,nonstatic的数据成员被置于类对象之内,而static数据成员被置于类对象之外。

static和nonstatic成员函数被放在类对象之外。而virtual函数是由类对象的一个指向vtbl(虚函数表)的指针vptr来进行支持。而vptr的设定和重置由类的构造函数、析构函数以及copy assignment运算符自动完成。

我们设计的每一个类几乎都要有一个或多个构造函数、析构函数和一个Assignment运算符。他们的作用是构造函数产生一个新的对象并确定它被初始化。析构函数销毁一个对象并确定它已经被适当的清理(避免出现内存泄露的问题),Assignment运算符给对象一个新值。

这是***章的***部分,由于雷神最近几天在做模式小组的主页,时间周转不开了。本想写完整个一章再发,考虑一下还是先发一部分吧。原因有2。1、***章的后半部可能又要拖上10天半个月的。

笔记实在难写,我不愿意将笔记做成将书上的重点再抄一边,而是喜欢尽量将自己的理解描述出来,谁知***章便如此的难以消化,已经反复读了3遍,还是有些夹生。所以本着对大家和自己负责的态度,雷神准备再看它3遍在说。突然发现自己的C++还差的很远,好可怕呀。

简单的对象模型 :

  1. Class Point   
  2. {   
  3. public:   
  4. Point(float xval); //1   
  5. virtual ~Point(); //2   
  6.  
  7. float x() const; //3   
  8. static int PointCount(); //4   
  9. protected:   
  10. virtual ostream& print(ostream &os) const; //5   
  11. float _x; //6   
  12. static int _point_count; //7   
  13. }  

当构造对象时便会有一个类似指针数组的东西存放着类数据成员在内存中位置的指针,还有指向成员函数的指针。为了对一个类产生的所有对象实体有一个标准的表达,所以对象模型采用了表格,把所有的数据成员放在数据成员表中,把所有的成员函数的地址放在了成员函数表中,而类对象本身有指向这两个表的指针。

责任编辑:chenqingxiang 来源: NET130
相关推荐

2010-01-21 16:18:06

C++语言

2010-01-19 10:04:30

C++类

2010-01-27 15:05:04

C++标准化

2010-02-03 17:06:36

C++对象复制

2010-01-14 14:17:20

Visual C++

2009-09-03 17:18:40

C#扩展性对象模型

2011-06-20 15:13:08

Qt 对象模型

2010-01-27 16:05:06

C++堆栈

2010-01-21 09:34:57

C++语法

2009-09-15 10:12:37

LINQ To SQL

2010-01-27 17:16:52

C++构造函数

2010-01-20 10:19:55

C++数组

2010-01-18 17:48:46

C++类对象

2021-10-19 14:04:28

C++类型数字

2010-01-26 14:35:11

C++关键字

2020-10-23 18:46:58

C++程序类别

2010-01-27 15:46:15

学习C++效率

2010-02-06 17:39:52

C++ strtok

2010-01-14 17:13:53

C++接口

2010-01-21 13:48:30

C++基类
点赞
收藏

51CTO技术栈公众号