C++结构体 - 毫无意义?

7

可能是重复问题:
C++中struct和class有什么区别?

我只是想弄清楚在C++中使用"C structs"是否完全无用。与创建另一个类相比,使用它们是否可以获得任何好处?

在C中,结构体的作用很明显,它们是一组数据的连续分配,并且是访问该数据的一种良好方式,在C ++中,我觉得这个角色变得有点模糊。

既然您可以拥有作为结构体成员的函数、实例变量和可见性标签,那么我在C++中看到的struct和class之间唯一的真正区别就是struct成员默认为public,而class成员默认为private。在我的看法中,它们实际上都可以使用完全相同的基础系统来实现。

所以,我在C ++中对struct的目的有所遗漏吗?或者它们已经失去了它们的目的,就像我觉得它们在C ++ 中一样?


嗯...显然这是从C继承而来的。 - Mysticial
同时,https://dev59.com/VG035IYBdhLWcg3wbPU5 - Lee Taylor
3
阅读这篇与Bjarne Stroustrup的采访的一部分:http://www.artima.com/intv/goldilocks3.html - halex
是的,我知道它是从C继承而来的。这不是我的问题的目的 - 根本不是。我想知道的是,在C++中使用结构体是否有所收获,尽管它们在我的观点中被“搞砸”了。C中的结构体与C++中的结构体并不相同,尽管具有向后兼容性,但由于它们与类具有完全相同的方面,我想知道是否使用它们会有所收获。我真的希望C++中的结构体保持与C中的结构体相同,只是连续分配的数据,没有函数,没有可见性,没有任何东西 - 只有变量。 - Syndacate
6个回答

4

C++中的类和结构体几乎相同,唯一的区别是类的默认可见性是private,而结构体的默认可见性是public

保留C++中结构体的原因可能是为了使语言与C兼容,这样就更容易将C代码移植到C++中,或者让程序员进行转换。

至于使用结构体还是类,我个人像在C中一样使用它们,将相关变量组合在一个单独的“对象”中。


2
还有公共继承和私有继承的问题。 - chris
是的,谢谢你,Joachim。我在我的问题中提到了默认可见性。我知道结构体在C++中存在是为了向后兼容C。我很好奇你是否获得了任何性能优势——如果C++中的结构体没有被混淆成类,那么它们应该只是一些连续分配的内存块——就像在C中一样。如果它们不被改变成类,那将是很好的。尽管看起来在C++中使用结构体并不能获得任何性能优势,这是非常不幸的。如果结构体没有开销,它们在C++中将非常有用。 - Syndacate

3

在我看来,结构体并没有比类更多的功能。但是为了与C语言保持向后兼容,C++中仍然保留了结构体。


2

毫无疑问,它们存在的原因是为了与C兼容。但是你是正确的,尽管在C ++中类和结构体之间有一些小差异,但你可以使用结构体做任何你可以使用类做的事情(反之亦然)。

个人而言,我只在相同的声明在C中合法时使用结构体,以强调我正在进行的任何操作的C样式特性。


2
他们“使用完全相同的基础系统”进行实现。事实上,您可以使用 class 关键字声明类型,然后使用 struct 关键字定义该类型。基本上,除了您已经提到的默认访问权限之外,它们完全相同。
但是我不明白为什么有人会称它们为“无用”。关键字的使用成为个人偏好和/或编码标准的问题。例如,“对于 POD 类型,请使用 struct”,或者“对于没有封装/访问控制的类型,请使用 struct”。
同样成功的是,可以将内置的 -> 运算符声明为“无用”,因为它等效于 *+. 组合。

-> 是较少的语法。class是比struct更短的单词。在C++中,struct是无用的。 - user652038
1
@Jessy: "...语法更少"是不相关的。->的根源实际上可以追溯到萌芽阶段的C语言,它具有不同的语义,不等同于*.的组合。关于struct的错误也是如此。为了提供公共访问,必须将classpublic:结合使用,这使得它比struct更加冗长,而不是更短。struct并不无用。它在C++中被大量使用,这从C++标准库的实现中立即显而易见。 - AnT stands with Russia
公共与私有问题已经无关紧要了;对于大多数类,你必须写private或public。我忘了提到struct甚至不是一个完整的单词。无用意味着其他东西已经比你做得更好了。Class是一个单词,它可以做struct所能做的一切。Struct没有用处。 - user652038
1
@Jessy:并不完全是这样。在所有成员都应该是公共的情况下,就没有必要写“private”了。此外,除了默认访问权限之外,“struct”和“class”之间没有任何区别,这完全消除了“class”更好的可能性(你真正的意思是什么?)。最后,C++标准库在适当的情况下大量使用“struct”。我想知道他们为什么这样做? - AnT stands with Russia

1

您可以像在 C 中一样使用相同的行为,没有人强制您使用额外的“类”功能。因此,如果您理解它们在 C 中的目的,那么在 C++ 中也应该是可以理解的(至少是“C-like”的部分)。


1

正如Joachim Pileborg所指出的那样,类和结构在C++中几乎是相同的东西。

然而,我建议将struct用于具有公共成员的“愚蠢”数据持有者,将class用于适当封装的类作为一种风格约定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接