1.公用接口与私有实现的分离

  • C++通过类来实现封装性,把数据和与这些数据有关的操 作封装在一个类中,或者说,类的作用是把数据和算法封 装在用户声明的抽象数据类型中。
  • 声明一个类后,用户通过调用公用的成员函数来实现类提供的功能,公用成员函数是用户使用类的公用接口,是类的对外接口。
  • 不一定把所有成员函数都指定为public的;
  • 在类外虽不能直接访问私有数据成员,但可通过调用公用成员函数来引用甚至修改私有数据成员;
  • 用户可以调用公用成员函数来实现某些功能,用户不用关心这些功能是如何实现的,只需知道调用哪个函数会得到什么结果,能实现什么功能即可。
  • 通过成员函数对数据成员进行操作称为类的实现,为了防止用户任意修改公用成员函数,用户一般只能接触到公用成员函数的目标代码。
  • 类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现(private implementation)。
  • 这种“类的公用接口与私有实现的分离”形成了信息隐蔽。信息隐蔽的好处:
    • 如果想修改或扩充类的功能,只需修改本类中有关的数据成员和与它有关的成员函数,程序中类外的部分可以不必修改。
    • 如果在编译时发现类中的数据读写有错,不必检查整个 程序,只需检查本类中访问这些数据的少数成员函 数。

2.类声明和成员函数定义的分离

  • 在面向对象的程序开发中,一般做法是将类的声明(其中 包含成员函数的声明)放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可。
  • 由于在头文件中包含了类的声明,因此在程序中就可以 用该类来定义对象。由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数。
  • 为了实现信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中。
  • 例:分别写两个文件 ```cpp //student.h (这是头文件,在此文件中进行类的声明) class Student //类声明
    { public: void display( ); //公用成员函数原型声明 private: int num; char name[20];
    char sex;
    }; //student.cpp //在此文件中进行函数的定义

    include

    include ″student.h″ //不要漏写此行,否则编译通不过

    void Student∷ display( ) //在类外定义display类函数 { cout<<″num:″<<num<<endl;
    cout<<″name:″<<name<<endl; cout<<″sex:″<<sex<<endl; }

//main.cpp 主函数模块

include

include ″student.h″ //将类声明头文件包含进来

int main( ) {Student stud; //定义对象 stud.display( ); //执行stud对象的display函数 return 0; } ```

  • 由于头文件student.h放在用户当前目录中,因此在文件名两侧用双撇号包起来(”student.h”)而不用尖括号(),否则编译时会找不到此文件。
  • 如果一个类声明多次被不同的程序所选用,每次都要对包含成员函数 定义的源文件(如上面的student.cpp)进行编译,这是否可以改进呢?
    • 可以只编译一次,把第一次编译后所形成的目标文件保存起来, 以后在需要时把它调出来直接与程序的目标文件相连接即可。
    • 在实际工作中,将若干个常用的功能相近的类声明集中在一起,形成类库
      • 类库有两种:
        • C++编译系统提供的标准类库;
        • 用户根据自己的需求做成的用户类库,称自定义类库。
      • 类库包括两部分:
        • 类声明头文件;
        • 已经过编译的成员函数的定义,它是目标文件。
      • 用户只需把类库装入到自己的计算机系统中(一般装到C++编译系统 所在的子目录下),并在程序中用#include命令行将有关的类声明的头 文件包含到程序中,就可以使用这些类和其中的成员函数,顺利地运 行程序。
    • 在用户源文件经过编译后,与系统库(是目标文件)相连接。
    • 在用户程序中包含类声明头文件,在头文件的类体中提供了成员函数 的函数原型声明,用户只有通过头文件才能使用有关的类。
    • 用户看得见和接触到的是这个头文件,任何要使用这个类的用户只需 包含这个头文件即可。
    • 包含成员函数定义的文件是类的实现,类声明和函数定义一般是分别 放在两个文本中的。
    • 由于要求接口与实现分离,软件开发商把用户所需的各种类的声明按 类放在不同的头文件中,同时对包含成员函数定义的源文件进 行编译,得到成员函数定义的目标代码。
    • 软件商向用户提供这些头文件和类的实现的目标代码(不提供函 数定义的源代码)。用户在使用类库中的类时,只需将有关头文件包含 到自己的程序中,并且在编译后连接成员函数定义的目标代码即可。

3.面向对象程序设计的名词

  • 类的成 员 函 数 在 面 向 对 象 程 序 理 论 中 被 称 为 “ 方 法”(method),“方法”是指对数据的操作。一个“方法” 对应一种操作。
  • 外界是通过发“消息”来激活有关方法的。所谓“消息”,其实就是一个命令,由程序语句来实现。前面的 stud.display( );就是向对象stud发出的一个“消息”,通知 它执行其中的display“方法”(即display函数)。