【问题标题】:What is the history of struct/class in C++?C ++中结构/类的历史是什么?
【发布时间】:2016-01-03 18:03:00
【问题描述】:

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

我知道除了默认成员/继承访问之外,结构在功能上与类相同。我的问题是:

为什么 C++ 中包含结构和类?从我在 C# 中的背景来看,结构和类有重要区别,似乎 C++ 中的 struct 只是用于定义具有默认公共性的类的语法糖。是吗?

不是在寻找意见关于何时/为什么应该使用一个而不是另一个 - 我出生在这些构造之后,我正在寻找历史 他们。他们是一起受孕的吗?如果是这样,为什么?如果不是,哪个先出现,为什么要添加第二个?我意识到这个社区中有许多可敬的长者可能对这些功能的起源有鲜活的记忆,并且链接到标准出版物或代码示例,其中一个或另一个首次出现,将增加答案的帮助.

请注意,这个问题不是

【问题讨论】:

    标签: c++ class struct standards


    【解决方案1】:

    为了简化多语言标头的开发。

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

    a question that has since been closed as too broad 中列出了 C 语言和 C++ 语言之间的一些差异。从使用这种公共子集语言编程的人的角度来看,这些差异可以被视为“实现定义的行为”,其中 C 语言的编译器产生一种行为,而 C++ 语言的编译器产生另一种行为。

    事实上,C++ 标准提供了帮助polyglot programs 开发的机制,这些机制在C 和C++ 语言中都有效。 extern "C" linkage specifier 允许部分用 C 和部分用 C++ 编写程序。 __cplusplus 符号用于 #ifdef __cplusplus conditions 有条件地启用宏、链接说明符和其他只有两种语言中的一种才能看到的细节。

    【讨论】:

    • 差异往往是微妙的。告诉初学者有一个共同的子集而不澄清是哪个是危险的(OTOH,这太宽泛了)。通常最好将它们视为不同的语言。
    • 使用相同的论点,您可以说 Modula-2 或 Java 代码与 C 和 C++ 共享一个公共子集,所有差异只是 IDB。废话,你说了算。
    • @Olaf 这就是为什么我强调大有用。 C 和 Java 之间的公共子集不够大,无法非常有用,几乎没有 C 和 C++ 之间的公共子集那么大,实际上鼓励 polyglot programming 在可能的情况下。
    • @tepples:任何重要的程序都必须使用特定于语言的功能。如果您使用 C++ 编写 C 风格的程序,您很快将不得不纠正为什么不使用该语言的特性,或者为什么不使用具有 特定特性的 C。对于初学者:暂定定义、原型样式声明符、VLA、枚举、(不)转换void *mallocnewconst 对象、标题等。如果你有一辆有四个轮子的汽车: 你只用了三个,把重物放在正确的位置吗?
    • @MichaelHoffmann “任何标准都鼓励 C++ 和 C 之间的多语言编程吗?”用于多语言标头的#ifdef __cplusplusextern "C" 链接说明符的存在就是肯定的证据。我会更新的。
    【解决方案2】:

    在过去(1980 年代末或 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++编译器是不是这样。

    【讨论】:

    • @dyp:这不是承包的:cfront 可以完全解析 C++ 代码并发出 struct 作为相同的 structclass 作为 struct
    【解决方案3】:

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

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

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

    【讨论】:

    • 完全不同意“更有意义”。
    • 我不知道是否同意/不同意@SergeyA,但我不清楚您所说的“更有意义”是什么意思。请详细说明你的答案?
    【解决方案4】:

    C++ 主要是 C 的超集。所以(大部分)如果你能用 C 做某事,你就可以用 C++ 做。结构是 C 的一个特性,包含在 C++ 中。 C++ 不是真正的超集的原因请参阅此:Where is C not a subset of C++?

    【讨论】:

    • “主要是……”不是真的。有时差异非常微妙。不应该对初学者提起这种印象,这会导致问题多于好处。
    • @Olaf 这就是我添加链接以显示差异的原因。
    • 好的,我删除了 DV。但是你实际上并没有回答这个问题。请详细说明。
    • 不知何故,这篇文章让我意识到 C++ 是最初的“把它变成 11”,因为它比 C“多一个”
    • @user3791372 当有人引用伟大的 Nigel Tufnel 时,总是美好的一天。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2019-04-15
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多