C/C 结构与类

新手上路,请多包涵

在完成我的 C++ 课程后,在我看来,结构/类几乎是相同的,只是有一些细微差别。

我以前从未用 C 编程过;但我知道它有结构。在 C 中是否可以继承其他结构并设置 public/private 修饰符?

如果您可以在常规 C 中做到这一点,为什么我们还需要 C++?是什么让类与结构不同?

原文由 anon235370 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 885
2 个回答

在 C++ 中,结构和类几乎相同。唯一的区别是类中的访问修饰符(用于成员变量、方法和基类)默认为私有,结构中的访问修饰符默认为公共。

但是, 在 C 中,结构只是(公共)数据的聚合集合,没有其他类似类的特性:没有方法、没有构造函数、没有基类等。虽然 C++ 继承了关键字,但它扩展了语义。 (然而,这就是为什么在结构中默认为 public 的原因——一个写得像 C 结构的结构表现得像一个结构。)

虽然可以在 C 中伪造一些 OOP——例如,定义所有将指向结构的指针作为其第一个参数的函数,或者 偶尔 将具有相同前几个字段的结构强制为“子/超类”——它总是有点螺栓固定,并不是真正的语言的一部分。

原文由 Antal Spector-Zabusky 发布,翻译遵循 CC BY-SA 3.0 许可协议

我将添加现有的答案,因为 现代 C++ 现在已经成为一种东西,并且已经创建了官方 核心指南 来帮助解决诸如此类的问题。

以下是指南中的相关部分:

C.2:如果类具有不变量,则使用类;如果数据成员可以独立变化,则使用 struct

不变量是对象成员的逻辑条件,构造函数必须为公共成员函数假设它建立。在建立不变量后(通常由构造函数),可以为对象调用每个成员函数。可以非正式地(例如,在评论中)或更正式地使用 Expects 来声明不变量。

如果所有数据成员都可以相互独立地变化,那么就不可能存在不变量。

如果一个类有任何私有数据,用户不能在不使用构造函数的情况下完全初始化一个对象。因此,类定义器将提供一个构造函数并且必须指定它的含义。这实际上意味着定义者需要定义一个不变量。

执法

寻找具有所有数据私有的结构和具有公共成员的类。

给出的代码示例:

 struct Pair {  // the members can vary independently
    string name;
    int volume;
};

// but

class Date {
public:
    // validate that {yy, mm, dd} is a valid date and initialize
    Date(int yy, Month mm, char dd);
    // ...
private:
    int y;
    Month m;
    char d;    // day
};

Class es 适用于例如相互派生或相互关联的成员。它们还可以帮助在实例化时进行健全性检查。 Struct s 非常适合拥有“数据包”,其中没有什么特别的事情发生,但从逻辑上讲,将成员分组在一起是有意义的。

由此看来, class es 的存在是为了支持封装和其他相关的编码概念,而 struct s 根本不是很有用。

原文由 Dave 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏