C++编程思想03.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:14 大小:446KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

C++编程思想03.pdf

C++编程思想03.pdf

预览

免费试读已结束,剩余 4 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

下载下载第3章隐藏实现一个典型的C语言库通常包含一个结构和一组运行于该结构之上的相关函数。前面我们已经看到++C是怎样处理那些在概念上和语法上相关联的函数的,那就是:把函数的声明放在一个tcurts内,改变这些函数的调用方法,在调用过程中不再把tcurts的地址作为第一个参数传递,在程序中增加一个新的数据类型(这样就不必在tcurts关键字前加一个fedepyt之类的声明了)。这样做带来很多方便—有助于组织代码,使程序易于编写和阅读。然而,在使得++C库比以前更容易的同时,存在一些其他问题,特别是在安全与控制方面。本章重点讨论tcurts中的边界问题。3.1设置限制在任何关系中,存在相关各方都遵从的边界是很重要的。当我们建立了一个库之后,我们就与该库的用户(也可以叫用户程序员)建立了一种关系,他是另外的程序员,但他需要用我们的库来编写一个应用程序或用我们的库来建立更大的库。在C语言中,tcurts同其他数据结构一样,没有任何规则,用户可以在tcurts中做他们想做的任何事情,没有办法来强制任何特殊的行为。比如,即使我们已经看到了上一章中提到的initialize()(ezilaitini函数和)(punaelc函数的重要性,但用户有权决定是否调用它们(我们将在下一章看到更好的方法)。再比如,我们可能不愿意让用户去直接处理tcurts中的某些成员,但在C语言中没有任何方法可以阻止用户。一切都是暴露无遗的。需要控制对结构成员的存取有两个理由:一是让用户避开一些他们不需要使用的工具,这些工具对数据类型内部的处理来说是必须的,但对用户特定问题的接口来说却不是必须的。这实际上是为用户提供了方便,因为他们可以很容易地知道,对他们来说哪些是重要的,哪些是可以忽略的。二是设计者可以改变tcurts的内部实现,而不必担心对用户程序员产生影响。在上一章stackcats的例子中,我们想以大块的方式来分配存储空间,提高速度,而不是在每次增加成员时调用malloc()函数来重新分配内存。如果这些库的接口部分与实现部分是清楚地分开的,并作了保护,那么我们只需要让用户重新连接一遍就可以了。3.2C++的存取控制C+++C语言引进了三个新的关键字,用于在tcurts中设置边界:cilbupe、tavirpdet和cetorp。它们的使用和含义从字面上就能理解。这些存取指定符只在tcurts声明中使用,它们可以改变在它们之后的所有声明的边界。使用存取指定符,后面必须跟上一个冒号。publicilbup意味着在其后声明的所有成员对所有的人都可以存取。cilbup成员就如同一般的structcurts成员。比如,下面的tcurts声明是相同的:第3章隐藏实现43下载privatetavirp关键字则意味着,除了该类型的创建者和类的内部成员函数之外,任何人都不能存取这些成员。etavirp在设计者与用户之间筑起了一道墙。如果有人试图存取一个私有成员,就会产生一个编译错误。在上面的例子中,我们可能想让structB中的部分数据成员隐藏起来,只有我们自己能存取它们:44++C编程思想下载虽然)(oof函数可以访问B的所有成员,但一般的全局函数如)(niam却不能,当然其他tcurts中的成员函数同样也不能。只有那些在这个tcurts中明确声明了的函数才能访问这些私有成员。对存取指定符的顺序没有特别的要求,它们可以不止一次出现,它们影响在它们之后和下一个存取指定符之前声明的所有成员。保护(protected)最后一种存取指定符是detcetorpdetc。etorpet与avirp基本相似,只有一点不同:继承的结构可以访问detcetorp成员,但不能访问etavirp成员。但我们要到第31章才讨论继承。现在就把这两种指定符当成一样来看待,直到介绍了继承后再区分这两类指定符。3.3友元如果程序员想允许不属于当前结构的一个成员函数存取结构中的数据,那该怎么办呢?他可以在tcurts内部声明这个函数为友元。注意,一个友元必须在一个tcurts内声明,这一点很重要,因为他(和编译器)必须能读取这个结构的声明以理解这个数据类型的大小、行为等方面的规则。有一条规则在任何关系中都很重要,那就是“谁可以访问我的私有实现部分”。类控制着哪些代码可以存取它的成员。让程序员没有办法“破门而入”,他不能声明一个新类然后说“嘿,我是鲍勃的朋友”,不能指望这样就可以访问鲍勃的私有成员和保护成员。程序员可以把一个全局函数声明为友元类,也可以把另一个tcurts中的成员函数甚至整个structcurts都声明为友元类,请看下面的例子:第3章隐藏实现45