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

原创 2002年02月01日 08:52:00
    软件开发是一个极其复杂的过程,一段小的代码我们可以快速、准确的完成,但是当你面对的是一个庞大的软件系统的时候,你是否有不知所措的感觉呢?
    在我们使用C的年代里面,编程思想是结构化的,你的C语言老师可能会不断的教导你怎样使用结构化的方法来完成一段程序,同时,你可能也知道在软件开发中的一个重要定律(Wirth定律):
程序 = 算法 + 数据结构
在结构化设计中人们通常是这样来看待这个定律的:
  程序 =(算法) + (数据结构)
例如:(我仍然使用C++标准库来写下面的代码,方便和以后的代码对比)
#include 
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"<>some->strname;
    cout<<"enter math"<>some->math;
    cout<<"enter chinese"<>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)C++中是它。类和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"<>strname;
      cout<<"enter math"<>math;
      cout<<"enter chinese"<>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)
 
  显然后面的结构比较复杂,更不要说缺乏有效的成员属性保护。另外一个面向对象的强大就是继承与多态,下一篇我们再来讨论。
 我希望我前面的表达足够的清楚,面向对象不是这样一篇文章可以描述的清楚的,我这里只是描述了一个发展过程的片面。我希望它能成为一个引子,能够为初学者提供一些帮助。

C++笔记:面向对象编程基础

面向对象编程基础 面向对象编程基于三个基本概念: 数据抽象-继承-动态绑定...
  • liufei_learning
  • liufei_learning
  • 2014年03月18日 06:20
  • 5932

经典C++笔试题目--100(C++面向对象的特性(38-61))

C++面向对象的特性(38-61) 38、是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? 【参考答案】 virtual修饰符会被隐形继承...
  • xiangjai
  • xiangjai
  • 2016年08月25日 14:38
  • 1098

谈谈8年C++面向对象设计的经验体会

六年前,我刚热恋“面向对象”(Object-Oriented)时,一口气记住了近十个定义。六年后,我从几十万行程序中滚爬出来准备写点心得体会时,却无法解释什么是“面向对象”,就象说不清楚什么是数学那样...
  • sinat_20265495
  • sinat_20265495
  • 2016年07月23日 14:46
  • 1703

C++面向对象的理解

 ----那23个经典的设计模式和OO半毛钱关系没有,只不过人家用OO来实现罢了。 设计模式就三个准则: 1)中意于组合而不是继承; 2)依赖于接口而不是实现; 3)高内聚,低耦合。 ...
  • u011200925
  • u011200925
  • 2017年02月17日 17:43
  • 828

C++ 面向对象五大原则

一,单一功能原则 原理:单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将功能定义为引起变化的原因,以提高内聚性来减少引起变化的原因。功能过多,可能引起它变化的原因就越多,这将导致功能依赖...
  • cloud323
  • cloud323
  • 2017年07月27日 10:12
  • 387

C++面向对象方法求解约瑟夫环问题

约瑟夫问题有很多种解法及其变种,这里的约瑟夫环问题是这样的: [b]约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数...
  • u010155023
  • u010155023
  • 2015年02月14日 12:39
  • 1081

C++编程杂谈之三:面向对象(续)

上一篇我们涉及了面向对象的一个基本概念--封装,封装是一个相对比较简单的概念,也很容易接受,但是很多的场合下面,仅仅是封装并不能很好的解决很多问题,考虑下面的例子: 假设我们需要设计一个对战游戏的战...
  • playboy1
  • playboy1
  • 2011年10月18日 14:51
  • 257

C++面向对象程序设计思想(精)

C++面向对象程序设计     六年前,我刚热恋''面向对象''(Object-Oriented)时,一口气记住了近十个定义。六年后,我从几十万行程序中滚爬出来准备写点心得体会时,却无法解释什么是'...
  • qq_37018433
  • qq_37018433
  • 2017年01月20日 15:00
  • 876

四则运算计算器(面向对象编程思维)

写计算器感知  1,定义接口   public interface ICalculate     {         double Operation(double operatorX...
  • stupid_Qiu
  • stupid_Qiu
  • 2017年04月13日 23:18
  • 253

VS2010 C++ MFC框架学习笔记5 - C++面向对象编程基础1

时隔一周多,再继续C++之路。 1. MSG结构体    Windows应用程序响应操作系统的消息,通过MSG结构体传达消息信息: 2. 消息队列 Windows消息队列,被应用程序逐条响应 注意2...
  • sonictl
  • sonictl
  • 2015年06月24日 17:38
  • 1010
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++编程杂谈:面向对象
举报原因:
原因补充:

(最多只允许输入30个字)