C / C ++结构与类


108

在完成我的C ++类后,在我看来这些结构/类实际上是相同的,只是有一些细微的差别。

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

如果您可以在常规C语言中执行此操作,那么为什么在全世界都需要C ++?是什么让类与结构不同?

c++  class  struct 


Answers:


146

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

但是,在C中,结构只是(公共)数据的聚合集合,没有其他类似类的功能:没有方法,没有构造函数,没有基类等。尽管C ++继承了关键字,但它扩展了语义。(但是,这就是为什么默认情况下结构以公共形式公开的原因-一种像C结构一样写的结构的行为就像一个。)

虽然可以在C语言中伪造一些OOP(例如,定义均以指向结构的指针作为其第一个参数的函数,或者偶尔将具有相同前几个字段的结构强制为“子/超类”),但这总是有点并没有真正成为语言的一部分。


从OOP预期净家伙已经将它定义这样 ✓考虑定义一个结构,而不是一类的,如果该类型的实例是小,通常短命或通常嵌入到其他对象。X避免定义一个结构,除非该类型具有以下所有特征:1.它在逻辑上表示一个值,类似于基本类型(int,double等)。2.它的实例大小小于16个字节。3.它是不变的。
Abhijeet 2015年

5
@Abhijeet这是C#中的结构和类之间的区别,但这与C ++无关,甚至与C无关。在C#中,类和结构实际上是不同的。在C ++中不是这样,并且C只有没有OO的结构。
Antal Spector-Zabusky

在C ++结构中保留相同的C语义会更好吗?何时需要使用“以C ++方式构造”仅使用类?与C相比,我从来没有从C ++中获得“增强型”结构的好处。我仍然喜欢在C中设计的地方使用struct,否则使用类,但允许某些例外。
拉斐尔

15

其他区别在于默认访问权限(公共/私有)之间没有区别。

但是,一些使用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


9
在您的C代码中使用cpp关键字,然后声称它与cpp不兼容是很愚蠢的
Dani

7

我将添加到现有答案中,因为现代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对于拥有“数据包”的用户来说,它工作得很好,虽然并没有什么特别的事情发生,但是从逻辑上讲,将成员分组在一起是有意义的。

由此看来,这是有道理的classES存在支持封装等相关编码概念,即structs为根本不是非常有用的。


另一个考虑因素是可移植性。structs是最可移植的。它们可以由C或C ++或来回使用。struct例如,也可以使用模块在Python中解压缩它们。如果您的项目优先排序是与其他语言,接口或系统兼容,更喜欢structclass。对于严格的程序内部事务,请选择class
戴夫

6

在C中无法定义成员函数或彼此派生结构。

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


我知道C中不存在模板等,但是我不知道C中的power结构。因此C ++仅使用结构向后兼容C吗?

4
只是为了向后兼容?在实际操作中,可能有一些区别,但是区别可能是意图的信号:在我使用“ struct我”的情况下,我指的是一种被动的POD类型的事物。
dmckee ---前主持人小猫,2010年

@dmckee:就其价值而言,大多数STL函子(即std::less)都定义为结构而不是类。
Billy ONeal

1
C ++与C并不完全兼容。您可以说struct关键字适合C开发人员。我喜欢仅以有序方式保存数据但本身不提供(很多)逻辑的类的struct关键字。
ypnos

@ypnos:请参阅我的最后评论。两者之间的唯一区别是,一个成员是默认的公共成员,另一个是默认的私有成员。
Billy ONeal 2010年

3

C ++的另一个不同之处是,当您从struct继承一个类而没有任何访问说明符时,它将变为公共继承,而对于类而言,它是私有继承。


1

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


2
就其价值而言,大多数STL函数(即std::less)被定义为结构,而不是类。
Billy ONeal 2010年

3
请注意,C ++结构确实具有方法,继承和可见性。
robertwb 2015年

c struct可以包含函数指针,尽管作为type(* addr)(params);
错误
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.