【发布时间】:2011-02-14 13:39:45
【问题描述】:
完成我的 C++ 课程后,在我看来,结构/类几乎相同,除了一些细微差别。
我以前从未用 C 编程过;但我知道它有结构。在 C 中是否可以继承其他结构并设置 public/private 修饰符?
如果您可以在常规 C 中做到这一点,为什么我们还需要 C++?类与结构有何不同?
【问题讨论】:
完成我的 C++ 课程后,在我看来,结构/类几乎相同,除了一些细微差别。
我以前从未用 C 编程过;但我知道它有结构。在 C 中是否可以继承其他结构并设置 public/private 修饰符?
如果您可以在常规 C 中做到这一点,为什么我们还需要 C++?类与结构有何不同?
【问题讨论】:
不能在 C 中定义成员函数或相互派生结构。
此外,C++ 不仅仅是 C+“派生结构”。 C 中不存在模板、引用、用户定义的命名空间和运算符重载。
【讨论】:
power。所以 C++ 只使用结构来“向后”兼容 C ?
struct 的地方是指一种很大程度上被动的 POD 类型的东西。
std::less)被定义为结构,而不是类。
在 C++ 中,结构和类几乎相同;唯一的区别是类中的访问修饰符(用于成员变量、方法和基类)默认为私有,结构中的访问修饰符默认为公共。
然而,在 C 中,结构只是(公共)数据的聚合集合,并没有其他类似类的特性:没有方法、没有构造函数、没有基类等。虽然C++继承了关键字,它扩展了语义。 (然而,这就是为什么在结构中默认为 public 的原因——一个写得像 C 结构的结构表现得像一个结构。)
虽然可以在 C 中伪造一些 OOP——例如,定义所有将指向结构的指针作为其第一个参数的函数,或者偶尔强制具有相同的前几个字段的结构“子/超类”——它总是有点固定,并不是真正的语言的一部分。
【讨论】:
C++ 使用结构主要是为了 1) 向后兼容 C 和 2) POD 类型。 C 结构没有方法、继承或可见性。
【讨论】:
std::less)被定义为结构,而不是类。
其他就是默认访问(public/private)的区别,没有区别。
但是,一些用 C 和 C++ 编写代码的商店会使用“class/struct”来指示哪些可以在 C 和 C++(结构)中使用,哪些是仅 C++(类)。换句话说,在这种风格中,所有结构都必须使用 C 和 C++。这就是为什么很久以前就存在差异的原因,当时 C++ 仍被称为“C with Classes”。
请注意,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++ 现在已经成为一种东西,并且已经创建了官方 Core Guidelines 来帮助解决诸如此类的问题。
以下是指南中的相关部分:
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
};
Classes 适用于例如相互派生或相互关联的成员。它们还可以帮助在实例化时进行健全性检查。 Structs 非常适合拥有“数据包”,其中实际上并没有什么特别的事情发生,但从逻辑上讲,将成员分组在一起是有意义的。
由此可见,classes 的存在是为了支持封装和其他相关的编码概念,而 structs 根本没有多大用处。
【讨论】:
structs 是最便携的。它们可以被 C 或 C++ 或来回使用。例如,它们也可以使用 struct 模块在 Python 中解压缩。如果您的项目优先考虑与其他语言、界面或系统的兼容,请首选struct 而不是class。对于严格的程序内部事务,首选class。