C++结构体可以有成员函数吗?

50

我曾经对结构体和类之间的区别感到非常困惑,因为它们似乎被用于几乎相同的事情。我在谷歌上搜索了它们的区别,但唯一的答案是结构体默认具有公共成员,而类默认具有私有成员。然而,我的讲师告诉我结构体不能包含成员函数。但是我在互联网上看到很多帖子中人们在结构体中包含成员函数,并明确表示这样做没问题。

我的讲师似乎坚信按照定义来说,结构体不能拥有函数,那是怎么回事呢?我唯一能想到的是,也许编译器会将结构体内的函数更改为其他类型,以便它们在技术上不包含函数...这些矛盾是否有一个清晰的答案?


9
也许他们的意思是C。 - chris
40
如果这门课程本应该是 C++ 课程,那么立即放弃它。 - aschepler
3
请向你的讲师推荐这份文件:https://isocpp.org/files/papers/N3797.pdf —— C++标准工作草案第9章。其中,“class”和“struct”这两个词通常可以互换使用。第3段甚至给出了一个拥有成员函数的“struct”示例。 - Benjamin Lindley
3
唯一的真正区别是默认情况下结构体继承是公有的(与默认成员访问权限一样),而类则是私有的。除此之外,它们完全相同。@aschepler,非常准确! - vsoftco
5个回答

50
我在谷歌上搜索差异,唯一看到的答案是结构体默认具有公共成员,而类默认具有私有成员。
是的,这是正确的。此外,默认情况下,结构体的基类是公开继承的,而类的基类是私有继承的。
将函数声明为结构体成员与将函数声明为类成员具有完全相同的语义,除了您指出的差异。在每种情况下,它们被称为成员函数。

7
这是正确答案。类和结构体唯一的区别是默认可见性。 - user3344003

7

C++中的structs可以有成员函数。另一方面,C结构体则完全不同——它们本质上是为某些索引提供名称和类型信息的数组。

(参考链接)

4
在C++98标准中:
结构体是使用class-key struct定义的类;它的成员和基类(第10条款)默认为public(第11条款)。
同时,
使用关键字class定义的类的成员默认为private。使用关键字struct或union定义的类的成员默认为public。
因此,这意味着struct和class之间唯一的区别就是默认的成员访问控制是public还是private。
C++结构体可以有成员函数。
如果这是一堂C语言课,那么这是正确的。如果这是一堂C++课,那么这是不正确的。
有一个明确的答案:C++结构体可以有成员函数。

2

在我看来,仅仅因为一种语言允许某些事情,并不意味着这是一个好主意。虽然在技术上,C++结构体可以包含函数,但我认为结构体数据类型最初的目的并不是包含函数。引入类类型的主要目的不是支持定义数据和处理数据的逻辑之间紧密关系,从而促进更健康的数据接口吗?


3
这是可以证明为错误的。Stroustrop自己在多次场合都这样说过。一个struct和一个class除了其他答案中提到的区别之外是相同的。 - jonspaceharper
1
那么为什么要在语言中添加类呢?为什么不只使用结构体...我从来不是C++的粉丝,因为它似乎过于复杂...有太多的方式让自己步入陷阱。语言中有两个几乎相同的关键字似乎是一个坏主意...一些较新的语言选择不这样做。Python倾向于提供一种明显正确的方法,这有助于编写更易维护的代码。也许Stroustrop故意使它们几乎相同...如果是这样,我说,“他真让我困惑”。 :) - Travis

-2

我目前正在开发一个项目,我意识到我的结构体需要提供比较运算符,以便包含它的排序列表能够进行排序。因此,在结构体中进行运算符重载是有意义的。这是使用带有方法的结构体的唯一合法原因。


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