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 }; |
例如,对于相互派生或相互关联的成员,
因此,存在
不能在C中定义成员函数或相互派生结构。
另外,C++不仅仅是C++的"派生结构"。模板、引用、用户定义的命名空间和运算符重载都不存在于C中。
C++中的另一个区别是,当您从结构中继承一个类而没有任何访问说明符时,它就变成了公共继承,在类的情况下,它是私有继承。
C++主要使用结构1)与C和2向后兼容的POD类型。C结构没有方法、继承或可见性。