当我研究C相对于C ++的优势时,遇到了这一段:
用C进行封装的标准方法是转发声明一个结构,并且仅允许通过函数访问其数据。此方法还会创建编译时封装。编译时封装使我们能够更改数据结构成员,而无需重新编译客户端代码(使用我们接口的其他代码)。另一方面,进行封装C ++的标准方法(使用类)要求在添加或删除私有成员变量时重新编译客户端代码。
我了解如何通过函数声明结构并访问其成员如何隐藏该结构的实现细节。我不明白的是这条线是:
编译时封装使我们能够更改数据结构成员,而无需重新编译客户端代码(使用我们接口的其他代码)。
在什么情况下适用?
这并非总是如此。如果决定添加/删除结构的成员,请更改其大小。这将需要重新编译客户端代码。
—
DarkAtom
@DarkAtom不正确!如果客户端不知道内容(不透明的结构),则不知道其大小,因此更改大小不是问题。
—
阿德里安·摩尔
@DarkAtom:仅允许通过函数访问结构包括仅通过函数进行分配。该库将提供分配结构的功能,而客户端将永远不知道其大小。更改大小不需要重新编译客户端。
—
埃里克·波斯特皮希尔
请注意,从技术上讲,这并不是“ C优于C ++”,因为您可以(并且经常)在C ++中实现相同的想法。查找“ pimpl”成语。
—
user4815162342 '19
struct是内部未知的黑匣子。如果客户端不了解内部结构,则永远无法直接访问它们,您可以随意更改它们。这类似于OOP中的封装。内部结构是私有的,您只能使用公共方法更改对象。