struct/class 在 C++ 中的历史是什么?

What is the history of struct/class in C++?

我正在学习 class 的 C++ 面向对象编程。在最近的一次作业中,我在 struct 中定义了一个成员函数。我的讲师解释说,虽然在结构中使用成员函数是可编译的,但他希望我们不这样做,以便与 C 向后兼容,并且(尤其是在这个初学者 class 中)练习良好的数据封装 - 我们应该使用struct 用于主要包含数据的类型,class 用于受益于更多程序封装的应用程序。他表示这种做法来自structs/classes在C++中的历史,这是我想了解的。

我知道结构在功能上与 classes 相同,除了默认的 member/inheritance 访问。我的问题是:

为什么 C++ 中包含结构和 classes?从我在 C# 的背景来看,结构和 classes 有重要的区别,C++ 中的 struct 似乎只是用于定义 classes 的语法糖,默认为 public-ness .是吗?

不征求意见 关于 when/why 一个应该被使用而不是另一个 - 我出生在这些构造之后,我是寻找他们的历史。他们是一起怀上的吗?如果是这样,为什么?如果不是,哪个在前,为什么要添加第二个?我意识到这个社区中有许多受人尊敬的长者可能对这些功能的起源有着鲜活的记忆,并且链接到标准 publications 或代码示例,其中两者,一个或另一个首次出现,将会增加答案的有用性。

请注意,这个问题是不是:

C++ 主要是 C 的超集。因此(大多数情况下)如果你能用 C 做某事,你也能用 C++ 做。结构是 C 的一个特性,包含在 C++ 中。由于 C++ 不是真正的超集,请参考此:Where is C not a subset of C++?

为了简化多语言开发 headers.

C 和 C++ 是不同的语言,但 C++ 语言旨在为 C 语言提供 大量有用的公共子集 。 C++ 语言中的几个常用结构与它们在 C 语言中的含义相同(或几乎相同)。在 struct 的情况下,C++ 语言将其定义为 class 的语法糖,它近似于 C 语言中 struct 的行为,即成员是 public默认。因此,可以在这个公共子集中编写一个程序或其中的一部分。例如,这允许一个库提供一个 单个 header 文件 ,它向用 C 语言编写的程序和用 C 语言编写的程序声明相同的 API C++ 语言。

C语言和C++语言的一些区别在a question that has since been closed as too broad中列出。从某些使用这种通用子集语言进行编程的人的角度来看,这些差异可以视为 "implementation-defined behavior",其中 C 语言的编译器产生一种行为,而 C++ 语言的编译器产生另一种行为。

事实上,C++ 标准提供了一些机制来帮助 polyglot programs that are valid in both C and C++ languages. The extern "C" linkage specifier allows a program to be written partly in C and partly in C++. And the __cplusplus symbol is used in #ifdef __cplusplus conditions 的开发,以有条件地启用宏、链接说明符和其他只有两种语言中的一种才能看到的细节。

两者都包含在原始的 C++ 语言中,但 struct 早于 C 语言中的 C++。

C++ 包含 structs,因为它从 C 继承了它们。没有理由将它们从 C++ 中删除并破坏可能使用 C++ 编译器编译的现有 C 代码库。

C++ 引入了 class 作为新关键字。据推测,引入关键字是为了提供将新创建的 C++ 类 与遗留 C 代码库中现有的 struct 区分开来的选项。

在过去(80 年代末或 1990 年代初),C++ 编译器(当时称为 cfront)将 C++ 代码转换为 C 代码。 C++ 广泛地 不同于当前的 C++11 或 C++14(甚至是旧的 C++03)。

我不记得细节了,但有可能struct 当时完全解析,但通过不变 到生成的 C 代码中,而 class 被预处理为不同的东西(并且被 翻译 struct)。

我可能完全错了,这是我的人为记忆,我只使用过几次(在 SunOS3,Sun3/160 工作站上)cfront。它让我印象深刻,但很感兴趣。那时,转换为 C 代码为构建过程增加了大量时间。但是 things have changed 很多,今天翻译成 C 很有意义...

(那时候,用 Ada 编译一个 hello world 程序需要 5 分钟,而 cfront 可能需要 3 分钟,但在 C 中不到一分钟)

后来C++的定义变了,struct foo {确实等同于class foo{ public:,但我不确定原始的C++编译器是不是这样。