3.1 设置限制

在任何关系中,存在相关各方都遵从的边界是很重要的。当我们建立了一个库之后,我们就与该库的用户(也可以叫用户程序员)建立了一种关系,他是另外的程序员,但他需要用我们的库来编写一个应用程序或用我们的库来建立更大的库。在C语言中,struct同其他数据结构一样,没有任何规则,用户可以在struct中做他们想做的任何事情,没有办法来强制任何特殊的行为。

比如,即使我们已经看到了上一章中提到的initialize()函数和cleanup()函数的重要性,但用户有权决定是否调用它们(我们将在下一章看到更好的方法)。再比如,我们可能不愿意让用户去直接处理struct中的某些成员,但在C语言中没有任何方法可以阻止用户。一切都是暴露无遗的。需要控制对结构成员的存取有两个理由:一是让用户避开一些他们不需要使用的工具,这些工具对数据类型内部的处理来说是必须的,但对用户特定问题的接口来说却不是必须的。这实际上是为用户提供了方便,因为他们可以很容易地知道,对他们来说哪些是重要的,哪些是可以忽略的。二是设计者可以改变struct的内部实现,而不必担心对用户程序员产生影响。在上一章stack的例子中,我们想以大块的方式来分配存储空间,提高速度,而不是在每次增加成员时调用malloc()函数来重新分配内存。如果这些库的接口部分与实现部分是清楚地分开的,并作了保护,那么我们只需要让用户重新连接一遍就可以了。

3.2 C++的存取控制

C++语言引进了三个新的关键字,用于在struct中设置边界:public、private和protected。它们的使用和含义从字面上就能理解。这些存取指定符只在struct声明中使用,它们可以改变在它们之后的所有声明的边界。使用存取指定符,后面必须跟上一个冒号。public意味着在其后声明的所有成员对所有的人都可以存取。public成员就如同一般的struct成员。比如,下面的struct声明是相同的:

为了更深入了解C语言中的存取控制机制,可以参考数据库中的存取控制自主存取控制强制存取控制。如果你对C和C++中typedef struct和struct的用法感兴趣,请查看这篇文章。对于想要掌握更多实际编程例子和源码的人,可以看看Alg Struct C Алгоритмы и структуры

如果你对C#编程中的struct定义有疑问,深入解析C#编程中struct所定义的结构可能会对你有所帮助。这些资源将帮助你更好地理解如何在不同编程语言中使用和控制struct结构。