深入解析C++编程中类的封装特性
共鼡为什么耳麦接口要分开和私有实现的分离
C++通过类来实现封装性把数据和与这些数据有关的操作封装在一个类中,或者说类的作用是紦数据和算法封装在用户声明的抽象数据类型中。
实际上用户往往并不关心类的内部是如何实现的而只需知道调用哪个函数会得到什么結果,能实现什么功能即可
在声明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能(例如对数据成员设置值顯示数据成员的值,对数据进行加工等)因此,公用成员函数是用户使用类的公用为什么耳麦接口要分开(public interface)或者说是类的对外为什么耳麥接口要分开。
类中被操作的数据是私有的实现的细节对用户是隐蔽的,这种实现称为私有实现(private implementation)这种“类的公用为什么耳麦接口要分開与私有实现的分离”形成了信息隐蔽。
软件工程的一个最基本的原则就是将为什么耳麦接口要分开与实现分离信息隐蔽是软件工程中┅个非常重要的概念。它的好处在于:
如果想修改或扩充类的功能只需修改本类中有关的数据成员和与它有关的成员函数,程序中类外嘚部分可以不必修改
如果在编译时发现类中的数据读写有错,不必检查整个程序只需检查本类中访问这些数据的少数成员函数。
类声奣和成员函数的分离
在面向对象的程序开发中一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中,用户如果想用該类只要把有关的头文件包含进来即可。
由于在头文件中包含了类的声明因此在程序中就可以用该类来定义对象。由于在类体中包含叻对成员函数的声明在程序中就可以调用这些对象的公用成员函数。
为了实现上一节所叙述的信息隐蔽对类成员函数的定义一般不放茬头文件中,而另外放在一个文件中
例如,可以分别写两个文件:
//这是student.h头文件在此文件中进行类的声明
为叻组成一个完整的源程序,还应当有包括主函数的源文件(main.cpp):
这是一个包括3个文件的程序组成两个文件模块:一个是主模块main.cpp,一个是student.cpp在主模块中又包含头文件student.h。在预编译时会将头文件student.h中的内容取代#include ″student.h″行
请注意,由于将头文件student.h放在用户当前目录中因此在文件名两侧用雙撇号包起来(″student.h″)而不用尖括号(<student.h>),否则编译时会找不到此文件
使用C++编译系统对两个源文件main.cpp和student.cpp分别进行编译,得到两个目标程序main.obj和student.obj然后將它们和其他系统资海连接起来,形成可执行文件main.exe见图 。
注意目标文件的后缀在不同的C++编译系统中是不同的,例如在GCC中后缀是 .o,这裏使用 .obj 是对VC 6.0而言
在运行程序时调用stud中的display函数,输出各数据成员的值
有的读者可能会考虑这样一个问题:如果一个类声明多次被不同的程序所调用,每次都要对包含成员函数定义的源文件(如上面的student.cpp进行编译这是否可以改进呢?的确可以不必每次都对它重复进行编译,洏只需编译一次即可把第一次编译后所形成的目标文件保存起来,以后在需要时把它调出来直接与程序的目标文件相连接即可 这和使鼡函数库中的函数是类似的。
这也是把成员函数的定义不放在头文件中的一个好处如果对成员函数的定义也放在类声明的头文件中,那麼在对使用这些类的每一个程序的每一次编译时都必然包括对成员函数定义的编译即同一个成员函数的定义会多次被重复编译。只有把對成员函数的定义单独放在另一文件中才能做到单独编译。
在实际工作中并不是将一个类声明做成一个头文件,而是将若干个常用的功能相近的类声明集中在一起形成类库。
类库有两种:一种是C++编译系统提供的标准类库;—种是用户根据自已的需要做成的用户类库提供给自己和自己授权的人使用,这称为自 定义类库在程序开发工作中,类库是很有用的它可以减少用户自己对类和成员函数进行定義的工作量。
类库包括两个组成部分:类声明头文件;已经过编译的成员函数的定义它是目标文件。
用户只需把类库装入到自己的计算機系统中(一般装到C++编译系统所在的子目录下)并在程序中用#include命令行将有关的类声明的头文件包含到程序中,就可以使用这些类和其中的成員函数顺利地运行程序。这和在程序中使用C++系统提供的标准函数的方法是一样的例如用户在调用sin函数时只需将包含声明此函数的头文件包含到程序中,即可调用该库函数而不必了解sin函数是怎么实现的(函数值是怎样计算出来的)。
当然前提是系统已装了标准函数库。在鼡户源文件经过编译后与系统库(是目标文件)相连接。
在用户程序中包含类声明头文件类声明头文件就成为用户使用类的公用为什么耳麥接口要分开,在头文件的类体中还提供了成员函数的函数原型声明用户只有通过头文件才能使用有关的类。用户看得见和接触到的是這个头文件任何要使用这个类的用户只需包含这个头文件即可。包含成员函数定义的文件就是类的实现
请特别注意,类声明和函数定義一般是分别放在两个文本中的由于要求为什么耳麦接口要分开与实现分离,为软件开发商向用户提供类库创造了很好的条件
开发商紦用户所需的各种类的声明按类放在不同的头文件中,同时对包含成员函数定义的源文件进行编译得到成员函数定义的目标代码。软件商向用户提供这些头文件和类的实现的目标代码(不提供函数定义的源代码)用户在使用类库中的类时,只需将有关头文件包含到自己的程序中并且在编译后连接成员函数定义的目标代码即可。
由于类库的出现用户可以像使用零件一样方便地使用在实践中积累的通用的或專用的类,这就大大减少了程序设计的工作量有效地提高了工作效率。