`

《C++学习笔记》【封装性】类的接口部分与实现部分的分离

    博客分类:
  • C++
阅读更多
===============================================

未完待续,转载时请表明出处:http://www.cofftech.com/thread-1390-1-1.html
欢迎大家跟帖讨论哈~~~~~
===============================================
按照软件工程的约定,一般只在类体内放置成员函数的原型说明,而这些函数的定义则放置于类体之外。
当类体中包含成员函数的函数定义时,称为类的定义。当类体中只包含成员函数的函数说明(即函数原型)而不包括函数定义时,则不称为类的定义而称为类的接口(interface)。
通常将类的接口部分放在供用户程序使用的头文件中,向用户提供为调用类的成员函数所需的函数原型,从而形成类的接口。
位于别处的包括所有成员函数的定义的部分则称为类的实现[方法] (implementation)。它们通常放在另外的隐藏的源文件中。这些隐藏的文件不提供给用户。
软件工程的一个基本原则是将供用户使用的类接口与类的实现[方法]分离。
对于用户而言,他们只须关心类的接口,只要类的功能不变也即类的接口部分不变,无论类的实现[方法]部分如何改变,都不影响用户使用,也无须修改用户程序。用户调用类的成员函数时不须了解类的源代码(即成员函数的定义),而只须了解类的功能也即类的接口即可。因此用户在使用时只须将可能改动过的类的实现[方法]的目标代码连接在用户程序之内即可。软件供应商提供头文件和各隐藏源文件的目标代码模块(即目标文件),以供用户用于编写各种用户程序。
将类接口的重要信息放在头文件中而将不希望用户了解的信息(类的实现[方法]部分)放在不公开发表的源文件(以下称为隐藏源文件)中,这符合最低权限原则。
描述类的功能而不谈其实现细节的做法,有时称为数据抽象(data abstraction)。有人称之为数据隐藏。C++依此方式所提供的所谓抽象数据类型(abstract data type)包括两个部分:类的接口和类的实现[方法]。
[例1]类的接口部分与类的实现[方法]部分彼此分离的例子,包括四个文件。
头文件mulfile.h
//只包括类的接口部分
#if       !defined(_MULFILE_H)
#define _MULFILE_H
#include <iostream.h>
class integ
{
  int j;
public:
  integ(int a) { i = a; }
  int sq();
};
class dbl
{
  double d;
public:
  dbl(double t) { d = t; }
  double sq();
};
#endif              //_MULFILE_H

第一个隐藏源文件mulfile1.cpp(包括类的实现部分,供应商只提供目标文件mulfile1.obj)
// mulfilel.cpp

#include "mulfile.h"
int jnteg::sq( )
{ return i*i; }

第二个隐藏源文件mulfile2.cpp(包括类的实现部分,供应商只提供目标文件mulfile2.obj)
// mulfile2.cpp

#include "mulfile.h"
double dbl::sq( )
{ return d*d; }

主文件mulfile_tst.cpp(用户编写的应用文件)
// mulfile_tst.cpp

#include "mulfile.h"
void main()
{
  int j;
  double d;
  integ ii(6);
  dbl dd(1.5);
  i = ii.sq();
  d = dd.sq();
  cout << i << endl;
  cout << d << endl;
}
/* Results:
   36
   2.25                  */
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics