高效的语言——C++入门

Author: 魏欣 Date: 2000年 第38期

  C++是继C之后推出的一种面向对象的编程语言,它的最大特点就是对象、类和继承机制。如果仅仅从语法上面看,可以认为它是对C的一些扩充。但我们先要明确一个问题:什么是面向对象编程?大家知道在传统的面向过程的程序设计中,一个程序就是定义一个数据结构,然后编码实现针对这个数据结构的若干操作。这样的设计方式允许大量的全局变量,这样就导致了在一些大型项目中程序结构的混乱。因而面向对象的程序设计方法就应运而生了。
  下面就让我们以C++为例子看看如何进行面向对象编程。所谓面向对象的程序设计,就是支持用“对象”这个单位来封装代码。比如:
  class example
  {
  private:
  int a,b;
  public:
  int operate(int m,int n);
  };
  这里就定义了一个类。类是创建对象的模板,它包含着所创建对象的状态描述和方法的定义,它的整个描述包含了外部数据接口、内部算法以及数据结构的形式。例子中的类也是一个对象,它有两个成员变量:int a,b和一个函数int operate()。成员变量就是类的属性,而函数就是类的方法。在面向对象语言中一个激动人心的特性就是类可以继承。这样就方便了代码的重复使用性。我们不必为了一个扩展而重新编写所有的代码。那什么是类的继承呢?比如我们现在要提供一个数据接口(类似于传统的输入输出参数),而我们不明确其他的程序员要用这个接口实现的具体任务,我们就可以提供一个抽象的类。比如,我们可以提供一个叫做“车”的类。这个类规定了“车”有轮子,能运动,但是并没有规定有多少轮子,怎么运动。那么在具体使用这个类的时候,我们可以根据自己的需要来具体扩展。你可以把它扩展为4个轮子,4轮驱动。这就是一个具体的类:跑车。你也可以扩展成8个轮子,那么毫无疑问这就是运送集装箱的货车了。在程序中这样实现扩展:
  class a:public b
  {
  ∥在这里添加类代码
  };
  这段代码用来定义一个类,这个类继承了b类中所有的public元素。在C++的类里面的成员有三种属性,分别是public,protected和private。struct默认成员为public,而class默认的成员是private的。现在分别说一下这三种类型的属性。
  public:(公有成员)
  标记为public的变量或者函数可以在这个类之外的函数中被使用,能够被继承,也能够由任意级别的派生类中调用父类(已有的类)的变量或者函数。
  protected:(保护成员)
  标记为protected的变量或者函数能够被继承,但只有下一级的派生类能够调用父类的变量或者函数,即它们能够被函数外部调用。
  private:(私有成员)
  只有函数的成员函数能够调用,对于外部是“不可见”的,也不能被继承。
  面向对象的编程有一个很重要的特性就是类的多态和重载。我们可以回忆一下用C的情形。如果我们要提供一个函数给别人使用,功能就是让两个数相加求和(为了说明问题,就用这个简单的例子了)。但是我们不知道可能传过来的参数会是什么。可能是两个int,可能是两个float,也可能是一个int和一个float。那么怎么办呢?我们只能这样做:
  int add_int(int a,int b);
  float add_float(float a,float b);
  float add_int_and_float(int a,float b);
  要记住这个被简化的例子。在实际的应用中可能有几十种的情况。怎么办呢?在C++中就可以得到很好的解决。函数的重载,指的是拥有相同函数名的若干函数,它们必须有不同的接口,就是说参数的类型或数目必须不完全相同。比如以上的问题就可以这样解决:
  int add_func(int,int);
  float add_func(float,float);
  float add_func(int,float);
  这里举一个很普通的例子。在VC的MFC类中有一个CDialog类,这是MFC定义的一个对话框的类,是Windows系统通用的。所有客户自己创建的对话框都必须从这个类继承。这个类中有一个函数叫做OnCancel(),当用户按下ESC键的时候回调函数调用这个函数。这样当用户按下ESC键的时候,对话框的所有变量清空,对话框关闭。如果要避免这种情况,并出现一句话“你好,《电脑报》软件世界!”怎么办呢?重载这个OnCancel()就可以了。因为我想在ESC键被按下的时候什么都不做,所以就需要把OnCancel()重载为标准输出语句。例如:
  class CMyDialog:public CDialog
  {
  ∥添加代码
  public:
  OnCancel();
  }
  CMyDialog::OnCancel()
  {
  cout << ″你好,《电脑报》软件世界!″;
  };
  这样就可以了。如果希望一个叫做Cancel的Button被按下的时候要做这个动作怎么办呢?如下调用父类的函数就可以了。
  CDialog::OnCancel();
  显示一句“你好,《电脑报》软件世界!”,然后就可以关闭对话框了。需要说明的是定义一个类之后仅仅有一个类型说明,这时候内存中还没有这个类。要使用一个类必须把它实例化,即创建一个实例。
  为了简单说明,我们可以回忆一下这样的语句:
  int a;
  int是一个数据类型,不能直接用。而int a就定义了一个叫做a的整型变量,然后就可以使用a来实现所有对int的操作了。同样class base{}也仅仅说明了一个叫做base的类,只有base m_base之后才可以使用m_base这个base类的实例。
  总之,一个类就是一个封装好的“黑盒子”。别人只需要关心怎么使用它所提供的数据接口就可以了。这样的编程思想对于一个大型的项目是很有好处的。
  在现在面向对象编程的工具中,比较通用的是Delphi和VB。VC比较深奥,VB其实严格来说不能算是面向对象的。这些就需要读者根据自己的实际需要来选择了。