C/C + + 结构与类

在完成我的 C + + 类之后,在我看来,结构/类实际上是相同的,除了一些细微的差别。

我以前从来没有用 C 语言编写过程序,但是我知道它是有结构的。在 C 语言中,是否可以继承其他结构并设置 public/private 的修饰符?

如果你能用普通的 C 语言做到这一点,那么我们为什么还需要 C + + 呢?什么使类不同于结构?

115342 次浏览

在 C 中不可能定义成员函数或从彼此派生结构。

而且,C + + 不仅仅是 C + 的“派生结构”。模板、引用、用户定义的名称空间和运算符重载都不存在于 C 语言中。

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

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

比如,定义一些函数,它们都将一个结构的指针作为它们的第一个参数,或者 偶尔强制使用相同的前几个字段的结构成为“子类/超类”ーー它总是有点像螺栓连接,并且不是语言的一部分。

C + + 使用结构主要是为了1)向后兼容 C 和2) POD 类型。C 结构没有方法、继承或可见性。

除了默认访问(公共/私有)的不同之外,没有区别。

但是,一些使用 C 和 C + + 编写代码的商店会使用“ class/struct”来表明哪些代码可以在 C 和 C + + (struct)中使用,哪些代码只能在 C + + (class)中使用。换句话说,在这种风格中,所有的结构都必须与 C 和 C + + 一起工作。这就是为什么很久以前 C + + 还被称为“带有类的 C”的时候会有所不同的原因

请注意,C 联合与 C + + 一起工作,但不是反过来

union WorksWithCppOnly{
WorksWithCppOnly():a(0){}
friend class FloatAccessor;
int a;
private:
float b;
};

我也是

typedef union friend{
int a;
float b;
} class;

只能用 C 语言

在 C + + 中还有一个不同之处,当您在没有任何访问说明符的情况下从 struct 继承一个类时,它将成为公共继承,而在类的情况下,它是私有继承。

我要补充现有的答案,因为 现代 C + + 现在是一个东西,官方的 一个 href = “ https://github.com/isocpp/CppCoreGuide/blob/master/CppCoreGuidelines.md”rel = “ noReferrer”> 核心指南已经创建,以帮助这些问题。

以下是指南中的相关章节:

如果类具有不变式,则使用 class; 如果数据成员可以独立变化,则使用 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适用于彼此派生或相互关联的成员。它们还可以帮助实例化时进行健全性检查。Struct在“数据袋”中工作得很好,这里没有什么特别的事情发生,但是成员被组合在一起在逻辑上是有意义的。

由此可见,classes 的存在是为了支持封装和其他相关的编码概念,而 struct对此并不十分有用。

由于还没有人提到它,除了默认可见性之外,实际上还有另一个不同之处。事实证明,classstruct在 MSVC 中实际上是不同的东西。

class Vector2;


struct Vector2 {
double x;
double y;
};

在大多数编译器上这是1个符号,但在 MSVC 上是2个不同的符号。只有这段代码本身可以很好地编译。但是,如果您尝试在更复杂的场景中使用它,您会遇到错误,在 MSVC 上不能编译它,因为它对符号感到困惑。