C / C ++结构与类

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

我以前从来没有用C编写过; 但我知道它有结构。 在C中是否可以inheritance其他结构并设置公有/私有的修饰符?

如果你可以在常规的C中做到这一点,为什么在世界上我们需要C ++吗? 什么使类与结构不同?

在C ++中 ,结构和类几乎相同; 唯一的区别是,如果类中的访问修饰符(对于成员variables,方法和基类)默认为私有,则结构中的访问修饰符默认为public。

然而在C语言中 ,结构只是(public)数据的集合集合,没有其他类的特性:没有方法,没有构造函数,没有基类等等。虽然C ++inheritance了关键字,但它扩展了语义。 (然而,这就是为什么在结构体中默认公共结构的原因 – 像C结构体这样的结构就像一个结构体。

虽然有可能在C中伪造一些OOP,例如定义一些函数,它们都将指针指向一个结构作为它们的第一个参数,或者偶尔强迫结构与前几个相同的字段为“sub / superclasses” – 它总是狂奔,并不是真正的语言的一部分。

其他那些在默认访问(public / private)方面的差异,没有什么区别。

但是,一些使用C和C ++编写的商店将使用“class / struct”来指示哪些可以在C和C ++(struct)中使用,哪些是仅用于C ++(class)。 换句话说,在这种风格下,所有的结构都必须使用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中定义成员函数或者派生结构是不可能的。

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

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

我将添加到现有的答案,因为现代的C + +是现在的事情和正式的核心指导原则已经创build,以帮助解决这些问题。

以下是准则中的相关部分:

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

不variables是构造函数必须为公共成员函数设定的对象成员的逻辑条件。 在不variablesbuild立之后(通常由构造函数),可以为对象调用每个成员函数。 一个不variables可以非正式地(例如,在评论中)或更正式地使用期望来表示。

如果所有的数据成员可以相互独立地变化,则不可能有任何不变。

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

强制

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

给出的代码示例:

 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对于有“数据包”的工作很好,没有什么特别的事情发生,但是成员在逻辑上是合理的。

从这个意义上说, class存在支持封装和其他相关的编码概念,这个struct对它来说并不是很有用。

C ++主要使用结构体1)向后兼容C和2)PODtypes。 C结构没有方法,inheritance或可见性。