博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类的封装性和信息隐蔽[转 非原创]
阅读量:6946 次
发布时间:2019-06-27

本文共 1699 字,大约阅读时间需要 5 分钟。

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

    1、C++通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中,或者说,类的作用是把数据和算法封装在用户声明的抽象数据类型中。在面向对象的程序设计中,在声明类时,一般都是把所有的数据指定为私有的,使它们与外界隔离,把需要让外界调用的成员函数指定为公用的,外界通过公用的函数来实现对数据的操作。外界与对象惟一的联系渠道就是调用公用的成员函数。这样就使类与外界的联系减少到最低限度。

    2、在声明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能(例如对数据成员赋值,显示数据成员的值,对数据进行加工等)。因此,公用成员函数是用户使用类的公用接口(pubic interface),或者说是类的对外接口。当然并不一定要把所有成员函数都指定为public(公用)的,但非public的成员函数就不是公用接口了。在类外虽然不能直接访问私有数据成员,但可以通过调用公用成员函数来引用甚至修改私有数据成员的值。

    3、用户可以调用公用成员函数来实现某些功能,而这些功能是在声明类时已指定的,用户可以使用它们而不应改变它们。实际上用户往往并不关心这些功能是如何实现的细节,而只需知道调用哪个函数会得到什么结果,能实现什么功能即可。如同使用照相机一样,只需知道按下快门就能照相即可,不必了解其实现细节,那是设计师和制造商的事。

    4、照相机的快门就是公用接口,用户通过使用快门实现照相的目的,但不能改变相机的结构和功能。一切与用户操作无关的部分都封装在机箱内,用户看不见,摸不着,改不了,这就是接口与实现分离。

    通过成员函数对数据成员进行操作称为类的实现,为了防止用户任意修改公用成员函数,改变对数据进行的操作,往往不让用户看到公用成员函数的源代码,显然更不能修改它,用户只能接触到公用成员函数的目标代码。可以看到:类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现(pnvate implementation)。这种“类的公用接口与私有实现的分离”形成了信息隐蔽。

    软件工程的一个最基本的原则就是将接口与实现分离,信息隐蔽是软件工程中一个非常重要的概念。它的好处在于:
    (1)如果想修改或扩充类的功能,只需修改奉类中有关的数据成员和与它有关的成员函数,程序中类外的部分可以不必修改。例如,想在声明的student类中增加一项数据成员“年龄”,只需这样改:

class student

    { private:
       int num;
       smng name;
       int age; //此行是新增的
       char sex;
      public:
       void display()
          { cout<<"num:"<<num<<endl;
            cout<<”nameI"<<name<<endl;
            cout<<"age:”<<age<<endl; //此行是新增的
            cout<<"sex:"<<sex<<endl; }
          };
 student stud;

    注意:虽然类中的数据成员改变了,成员函数display的定义改变了,但是类的对外接口没有改变,外界仍然通过公用的display函数访问类中的数据。程序中其他任何部分均无需修改。当然,类的功能改变了,在调用stud对象的display时,输出该学生的学号、姓名、年龄和性别的值。

    可以看出:当接口与实现(对数据的操作)分离时,只要类的接口没有改变,对私有实现的修改不会影响程序的其他部分。对用户来说,类的实现方法的改变,不会影响用户,只要保持类的接口不变即可。譬如,软件开发商想对以前提供给客户的类库进行修改升级,只要保持类的接口不变,即用户调用成员函数的方法(包括函数参数的类型和个数)不变,用户的程序就不必修改。

    (2)如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的少数成员函数。这样,就使得程序(尤其是大程序)的设计、修改和调试都显得方便简单了。

 

转载于:https://www.cnblogs.com/daiercaomei/archive/2013/05/29/3107031.html

你可能感兴趣的文章
Disruptor多个消费者不重复处理生产者发送过来的消息
查看>>
vuejs_01项目启动
查看>>
[LeetCode] Candy Crush 糖果消消乐
查看>>
04.变量和常量
查看>>
图像采集调试总结
查看>>
iOS适配HTTPS,创建一个自签名的SSL证书(x509)具体步骤
查看>>
1111111
查看>>
XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法...
查看>>
弱符号与强符号,弱引用与强引用
查看>>
009PHP文件处理——文件处理 file_get_contents file_put_contents fgetc fgets fgetss
查看>>
spring boot项目在外部tomcat环境下部署
查看>>
基于C#在Mongodb的Skip-Limit和Where-Limit的分页对比 并且含mongodb帮助类的源码
查看>>
060——VUE中vue-router之路由嵌套在文章系统中的使用方法:
查看>>
tenda某路由器信息泄露查找
查看>>
uva 10710 - Chinese Shuffle(完美洗牌)
查看>>
怎么清除火狐浏览器的cookie?
查看>>
连麦介绍
查看>>
MQTT 客户端源码分析
查看>>
IT思想类智力题
查看>>
php设计模式-单例模式
查看>>