C / C ++ Struct vs Class

C/C++ Struct vs Class

在我的C++类完成后,在我看来,结构/类几乎是相同的,除了一些小的差异。

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

如果你能在常规C中做到这一点,为什么我们需要C++?什么使类与结构不同?


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

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

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


另外,在默认访问(公共/私有)上的差异,没有区别。

然而,在C和C++中的一些商店将使用"类/结构"来指示哪些可以在C和C++中使用,而C++是唯一的(类)。换句话说,在这种风格中,所有的结构都必须与C和C++一起工作。这就是为什么在很久以前,当C++仍然被称为"带有类的C"时,第一个地方就有区别了。

注意C结合使用C++,但不是相反的。例如

1
2
3
4
5
6
7
union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};

同样地

1
2
3
4
typedef union friend{
    int a;
    float b;
} class;

仅在C中工作


我将添加到现有的答案,因为现代C++是一个东西,官方核心指南已经被创建来帮助解决这些问题。

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

C.2: Use class if the class has an invariant; use struct if the data members can vary independently

An invariant is a logical condition for the members of an object that a constructor must establish for the public member functions to assume. After the invariant is established (typically by a constructor) every member function can be called for the object. An invariant can be stated informally (e.g., in a comment) or more formally using Expects.

If all data members can vary independently of each other, no invariant is possible.

If a class has any private data, a user cannot completely initialize an object without the use of a constructor. Hence, the class definer will provide a constructor and must specify its meaning. This effectively means the definer need to define an invariant.

Enforcement

Look for structs with all data private and classes with public members.

给出的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
};

例如,对于相互派生或相互关联的成员,Classes工作得很好。它们还可以帮助在实例化时进行健全性检查。Struct的"数据包"很好地工作,在那里没有什么特别的事情发生,但是成员逻辑上是有意义的分组在一起。

因此,存在Classes来支持封装和其他相关的编码概念是有意义的,Structs对于这些概念并不是很有用。


不能在C中定义成员函数或相互派生结构。

另外,C++不仅仅是C++的"派生结构"。模板、引用、用户定义的命名空间和运算符重载都不存在于C中。


C++中的另一个区别是,当您从结构中继承一个类而没有任何访问说明符时,它就变成了公共继承,在类的情况下,它是私有继承。


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