Make Www.Edu-cn.Com Your Home Page!
用户名: 密码: 验证码: 注册
  当前位置: > 中国教程网>软件开发>vc> C++编程杂谈之二:面向对象

C++编程杂谈之二:面向对象

作者:   来源:中国教程网   点击:   日期:2007-04-02

编程杂谈之二:面向对象
作者/xulion
软件开发是一个极其复杂的过程,一段小的代码我们可以快速、准确的完成,但是当你面对的是一个庞大的软件系统的时候,你是否有不知所措的感觉呢?
在我们使用C的年代里面,编程思想是结构化的,你的C语言老师可能会不断的教导你怎样使用结构化的方法来完成一段程序,同时,你可能也知道在软件开发中的一个重要定律(Wirth定律):
程序 = 算法 + 数据结构
在结构化设计中人们通常是这样来看待这个定律的:
  程序 =(算法) + (数据结构)
例如:(我仍然使用标准库来写下面的代码,方便和以后的代码对比)
#include <iostream>using namespace std ;typedef struct Student{    char strname[50];  //姓名    int  math;         //数学分数    int  chinese;      //语文    int  total;         //总分}STUDENT;void InitData(STUDENT* some){    //////////////////////////////////////    //初始化数据     some->strname[0] = ''''\0'''';     some->math       = 0;     some->chinese    = 0;     some->total      = 0;}void InputData(STUDENT* some){    ///////////////////////////////////////    //获取输入    cout<<"enter name"<<endl;    cin>>some->strname;    cout<<"enter math"<<endl;    cin>>some->math;    cout<<"enter chinese"<<endl;    cin>>some->chinese;    //////////////////////////////////////    //计算总分    some->total = some->math + some->chinese;}void PrintData(STUDENT some){    cout<<some.strname<<"''''s total mark is:"<<some.total<<endl;}//上面的部分可以单独放在一个头和CPP中main(){    STUDENT someone;    InitData(&someone);    InputData(&someone);    PrintData(someone);}  
中国教育网
到目前为止,程序的划分变得相对简单了,团队的开发才成为可能。在面向对象中,所存在的Wirth定律与上面的结构非常类似:
  对象 = (算法 + 数据结构)
  程序 = 对象 + 对象
  表面上似乎二者之间并没有太大的差别,但就是这个差别为我们带来了巨大的变革。
  有这样一句话:“编程是在计算机中反映世界”,我觉得再贴切不过,面向对象(Object-Oriented)对这种说法的体现也是最优秀的,比如在前面的例子中,我们设计的数据结构是一个学生成绩的表现,而对数据结构的操作(函数)是分离的,虽然这些操作是针对这种数据结构而产生的。为了管理大量的数据,我们不得不小心翼翼地使用它们。
  面向对象中一个重要的概念就是类(class)中是它。类和struct数据结构最大的不同就是提供了限制级别(可见性)的保护——我们先抛开复杂的继承与多态不谈。正是通过这种方式,我们可以对数据成员提供非常有效的保护,同时使数据结构更符合现实行为。
  在面向对象的概念中,前面的数据结构表示如下:
  #include   using namespace std;  class Student  {  private:      //属性      char strname[50];  //姓名      int  math;         //数学分数      int  chinese;      //语文      int  total;         //总分  public:  //方法      char* getname(){ return strname; };      int getmath(){ return math; };      int getchinese(){ return chinese; };      int gettotal(){ return total; };      Student();      void InputData();      void PrintData();  };    Student::Student()  {      //////////////////////////////////////      //初始化数据      strname[0] = ''''\0'''';      math       = 0;      chinese    = 0;      total      = 0;  }    void Student::InputData()  {      ///////////////////////////////////////      //获取输入      cout<<"enter name"<<endl;      cin>>strname;      cout<<"enter math"<<endl;      cin>>math;      cout<<"enter chinese"<<endl;      cin>>chinese;        //////////////////////////////////////      //计算总分      total = math + chinese;  }    void Student::PrintData()  {	cout<<strname<<"''''s total mark is:"<<total<<endl;      }    int main()  {      Student someone;      someone.InputData();      someone.PrintData();  }  
中国教程网
  
  我们先不去关心类的实现细节,现在对比一下main函数中的调用过程,每种方法和相应的数据结构联系在了一起,对外部的调用来说,我们不需要去关心数据结构和相应算法的关系,因为他们已经关联在了一起。也许这个例子不够说明问题,也许我的说明含糊不清,但是你想象一下:如果我们对一个物体,比如狗来建模,我们需要确定其属性(颜色、大小)和行为(跑、叫),我们肯定希望这些都与狗这个模型关联在一起:
Class dog  (属性)   Color   Size  (行为)   Run   yelp如果是结构话的:Struct dog   Color   Size                 (依赖关系)  Run(dog somedog)      yelp(dog somedog)  
www.edu4u.com.cn
显然后面的结构比较复杂,更不要说缺乏有效的成员属性保护。另外一个面向对象的强大就是继承与多态,下一篇我们再来讨论。
 我希望我前面的表达足够的清楚,面向对象不是这样一篇文章可以描述的清楚的,我这里只是描述了一个发展过程的片面。我希望它能成为一个引子,能够为初学者提供一些帮助。
 
 

中国教育网



文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【论坛讨论

   最新文章:
·static_cast揭密(04-02)
·泛型编程-转移构造函数(Generic Prog(04-02)
·使用MFC的数组类(04-02)
·浅析VC与MATLAB联合编程(04-02)
·精通VC与MATLAB联合编程——综合举例(04-02)
·精通VC与Matlab联合编程(五)(04-02)
·精通 VC 与 MATLAB 联合编程——综合(04-02)
·在VC资源文件中加入声音资源(04-02)
·const传奇(04-02)
·初始化类对象(04-02)
   相关文章:
·C++编程杂谈之三:面向对象(续) ·C++编程杂谈之一:编译器
·初始化类对象 ·解析动态联编(上篇) - 作者:tingya
·单实例设计模式的实现 ·解析动态联编(下篇) - 作者:tingya
·为什么operator=操作符返回引用 ·创建和访问环境变量
·自制性能测试类 ·在预先定义的内存位置构造一个对象

   文章评论:(0条)
  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。

 §最新评论:

  责任编辑:中国教程网  

© 2007 Copyright 中国教育网
DesignBy:AOE3 STUDIO & ROCOCO