C++结构可以有成员函数吗?
Posted
技术标签:
【中文标题】C++结构可以有成员函数吗?【英文标题】:Can C++ struct have member functions? 【发布时间】:2014-08-03 12:22:01 【问题描述】:我对 struct 和 class 之间的区别感到非常困惑,因为我似乎看到它们用于几乎相同的事情。我用谷歌搜索了差异,我看到的唯一答案是结构默认具有公共成员,而类默认具有私有成员。但是,我的讲师刚刚告诉我,结构不能包含成员函数。但是我在互联网上看到了很多线程,人们在结构中包含成员函数,并明确表示可以这样做。
我的讲师似乎坚持认为,根据定义,结构不能具有函数,所以这是怎么回事?我唯一能想到的可能是编译器将结构中的函数更改为其他内容,以便它们在技术上不包含函数......这些矛盾有明确的答案吗?
【问题讨论】:
也许他们的意思是 C. 如果这应该是 C++ 课程,请立即放弃。 将您的讲师指向此文档。 isocpp.org/files/papers/N3797.pdf -- C++ 标准的工作草案,第 9 章。类和结构这两个词大多可以互换使用。第 3 段甚至有一个带有成员函数的结构示例。 唯一真正的区别是结构继承默认是公共的(因为它是默认的成员访问),而类是私有的。除此之外,它们完全相同。 @aschepler,当场! 【参考方案1】:我用谷歌搜索了差异,我看到的唯一答案是结构默认具有公共成员,而类默认具有私有成员。
是的,这是正确的。此外,结构的基类默认是公开继承的,而类的基类默认是私有的。
将函数声明为结构的成员与将函数声明为类的成员具有完全相同的语义,除了您提到的区别。在每种情况下,它们都被称为成员函数。
【讨论】:
这是正确答案。类和结构之间的ONLY 区别在于默认可见性。【参考方案2】:C++ structs
可以definitely have member functions。另一方面,C 结构体是一种截然不同的野兽——它们本质上是为某些索引提供名称和类型信息的数组。
【讨论】:
【参考方案3】:在 C++98 标准中:
结构体是使用类键结构体定义的类;它的成员和基类(第 10 条)默认是公共的(第 11 条)。
和
使用关键字class定义的类的成员默认是私有的。默认情况下,使用关键字 struct 或 union 定义的类的成员是公共的。
所以这意味着struct
和class
之间的唯一区别是默认的成员访问控制是public
或private
。
C++ struct 可以有成员函数吗?
是的,他们可以。
我的讲师似乎坚持认为,根据定义,结构不能具有函数,所以这是怎么回事?
如果是关于 C 的讲座,那是正确的。 如果是C++的讲座,那就不正确了。
我唯一能想到的可能是编译器将结构中的函数更改为其他内容,以便它们在技术上不包含函数......这些矛盾是否有明确的答案?
是的,有一个明确的答案:C++ struct 可以有成员函数。
【讨论】:
【参考方案4】:在我看来,仅仅因为某种语言允许某些东西并不意味着它是一个好主意。尽管从技术上讲,C++ 结构可以包含函数,但我不认为 struct 数据类型的初衷是包含函数。引入 Class 类型以支持定义数据和以紧密关系作用于数据的逻辑,从而促进更健康的数据接口,这难道不是主要目的吗?
【讨论】:
这显然是错误的。斯特劳斯特罗普本人在很多场合也说过同样的话。除了其他答案中提到的以外,结构和类是相同的。 那么为什么要在语言中添加类呢?为什么不只使用结构......我从来都不是 C++ 的忠实粉丝,仅仅是因为它看起来过于复杂......有很多方法可以让你自己在脚下开枪。在语言中使用两个几乎相同的关键字似乎是个坏主意……当然,较新的语言选择不这样做。 Python 倾向于提供一种且只有一种明显正确的做事方式,这有助于编写更易于维护的代码。也许 Stroustrop 确实故意让它们几乎完全相同......如果是这样,我说,“他让我感到困惑”:)【参考方案5】:我目前正在做一个项目,我刚刚意识到我的结构需要能够提供比较运算符,以便包含它的排序列表能够进行排序。因此,在结构中进行运算符重载是有意义的。这是拥有带有方法的结构的唯一正当理由。
【讨论】:
以上是关于C++结构可以有成员函数吗?的主要内容,如果未能解决你的问题,请参考以下文章
C++文档阅读笔记-Difference Between C Structures and C++ Structures
C++文档阅读笔记-Difference Between C Structures and C++ Structures
C++文档阅读笔记-Difference Between C Structures and C++ Structures