C/C++ Struct vs Class

104 c++ struct class

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

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

如果你能在常规C中做到这一点,为什么我们需要C++?是什么让类与结构不同?

Ant*_*sky 141

在C++中,结构和类几乎相同; 唯一的区别是,类中的访问修饰符(对于成员变量,方法和基类)默认为private,结构中的访问修饰符默认为public.

但是,在C中,struct只是(公共)数据的聚合集合,并且没有其他类的特性:没有方法,没有构造函数,没有基类等.虽然C++继承了关键字,但它扩展了语义.(但是,这就是为什么在结构中默认为public的原因 - 像C结构一样编写的结构就像一个结构.)

虽然可以在C中伪造一些OOP,例如,定义所有将指向结构的指针作为其第一个参数的函数,或偶尔使用相同的前几个字段强制转换为"sub/superclasses"的结构 - 总是排序狂奔,并不是真正的语言的一部分.

  • @Abhijeet这是C#中结构和类之间的区别,但这与C++无关,对C来说更是如此.在C#中,类和结构实际上是不同的; 在C++中不是这样,而C只有没有OO的结构. (4认同)

Lan*_*uck 14

其他即默认访问(公共/私有)的差异,没有区别.

但是,一些使用C和C++编写代码的商店将使用"class/struct"来表示哪些可用于C和C++(struct),哪些只能用于C++(类).换句话说,在这种风格中,所有结构必须使用C和C++.这就是为什么很久以前第一个地方存在差异,当时C++仍然被称为"C with Classes".

请注意,C联合使用C++,但不是相反.例如

union WorksWithCppOnly{
    WorksWithCppOnly():a(0){}
    friend class FloatAccessor;
    int a;
private:
    float b;
};
Run Code Online (Sandbox Code Playgroud)

同样地

typedef union friend{
    int a;
    float b;
} class;
Run Code Online (Sandbox Code Playgroud)

仅适用于C

  • 在你的c代码中使用cpp关键字然后声称它不是cpp兼容是相当愚蠢的 (7认同)

Joh*_*itb 6

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

此外,C++不仅仅是C +"派生结构".C中不存在模板,引用,用户定义的命名空间和运算符重载.

  • 只是为了向后兼容?在实际的基础上可能有一些东西,但区别可能是意图的信号:我使用`struct`我指的是很大程度上被动的POD类型的东西. (4认同)

Dav*_*ave 6

我将添加现有的答案,因为现代C++现在已成为一种东西,并且已经创建了官方核心指南来帮助解决这些问题.

以下是指南中的相关部分:

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

不变量是构造函数必须为公共成员函数设置的对象成员的逻辑条件.在建立不变量之后(通常由构造函数),可以为对象调用每个成员函数.可以非正式地(例如,在评论中)或更正式地使用期望来陈述不变量.

如果所有数据成员可以彼此独立地变化,则不可能存在不变量.

如果类具有任何私有数据,则用户无法在不使用构造函数的情况下完全初始化对象.因此,类定义器将提供构造函数并且必须指定其含义.这实际上意味着定义者需要定义一个不变量.

强制

查找所有数据私有的结构和具有公共成员的类.

给出的代码示例:

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
};
Run Code Online (Sandbox Code Playgroud)

Class例如,彼此派生或相互关联的成员可以很好地工作.他们还可以在实例化时帮助进行健全性检查.Struct对于拥有"数据包"的工作做得很好,其中没有什么特别的东西真正发生,但成员在逻辑上有意义地组合在一起.

从这一点来看,class有必要支持封装和其他相关的编码概念,这些概念struct根本不是很有用.