Answers:
在C ++中,结构和类几乎相同。唯一的区别是,类中的访问修饰符(用于成员变量,方法和基类)默认为私有,而结构中的访问修饰符默认为公共。
但是,在C中,结构只是(公共)数据的聚合集合,没有其他类似类的功能:没有方法,没有构造函数,没有基类等。尽管C ++继承了关键字,但它扩展了语义。(但是,这就是为什么默认情况下结构以公共形式公开的原因-一种像C结构一样写的结构的行为就像一个。)
虽然可以在C语言中伪造一些OOP(例如,定义均以指向结构的指针作为其第一个参数的函数,或者偶尔将具有相同前几个字段的结构强制为“子/超类”),但这总是有点并没有真正成为语言的一部分。
其他区别在于默认访问权限(公共/私有)之间没有区别。
但是,一些使用C和C ++编写代码的商店将使用“类/结构”来指示哪些可以在C和C ++中使用(结构),哪些仅用于C ++(类)。换句话说,以这种样式,所有结构都必须与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 ++现在已经成为事物,并且已经创建了官方的Core Guidelines来帮助解决此类问题。
这是指南中的相关部分:
C.2:如果类具有不变性,请使用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
对于拥有“数据包”的用户来说,它工作得很好,虽然并没有什么特别的事情发生,但是从逻辑上讲,将成员分组在一起是有意义的。
由此看来,这是有道理的class
ES存在支持封装等相关编码概念,即struct
s为根本不是非常有用的。
struct
s是最可移植的。它们可以由C或C ++或来回使用。struct
例如,也可以使用模块在Python中解压缩它们。如果您的项目优先排序是与其他语言,接口或系统兼容,更喜欢struct
了class
。对于严格的程序内部事务,请选择class
。
在C中无法定义成员函数或彼此派生结构。
而且,C ++不仅是C +“派生结构”。模板,引用,用户定义的名称空间和运算符重载在C中都不存在。
struct
我”的情况下,我指的是一种被动的POD类型的事物。
std::less
)都定义为结构而不是类。
C ++主要将结构用于1)与C的向后兼容性和2)POD类型。C结构没有方法,继承或可见性。
std::less
)被定义为结构,而不是类。