为什么我们在C++中需要一个“类”,而“结构”可以用来实现同样的目的
Why do we need a `class` in C++, when a `struct` can be used to achieve the same?
使用struct
,我们可以实现class
的所有功能:构造函数(可以修改/重载)、析构函数(可以修改或重载)、运算符重载、实例方法、静态方法、public
/private
/protected
字段/方法。
为什么我们需要class
?
注意:我不希望答案说在struct
中,字段/方法默认为public
。
您不需要类,该语言只是为您提供了另一个选择。从技术上讲,你是对的,你可以用struct
实现class
可以做的任何事情。
除了默认的访问级别,大多数程序员还将这两个级别联系在一起——struct
通常意味着一种轻量级的数据类型,通常是POD
,几乎没有功能。class
通常与更大的事物相关联。
正如Tal Pressman在C++中应该何时使用类与结构?中回答的那样:
来自C++常见问题解答:
结构的成员和基类默认情况下是公共的,而在类中,它们默认为私有的。注意:您应该使基类显式地公开、私有或受保护,而不是依赖于默认值。
结构和类在其他方面是等效的。
好吧,听够了那种干净的科技谈话。从情感上讲,大多数开发人员对类和结构进行了强烈的区分。一个结构感觉就像是一堆开放的比特,几乎没有封装或功能。一个阶级感觉像是一个有活力、有责任感的社会成员,拥有智能服务、强大的封装屏障和定义良好的界面。由于这是大多数人已经拥有的内涵,如果你有一个方法很少并且有公共数据的类(这样的东西确实存在于设计良好的系统中!),你可能应该使用struct关键字,但除此之外,你可能还应该使用class关键字。
http://www.parashift.com/c++-faq-lite/classes and objects.html#faq-7.8
我认为这个原因的一个补充可能是C已经有了structs。当Bjarne Stroustrup设计C++时,他想添加具有您在原始问题中列出的所有功能的类,这些功能在C中不存在。在实现这些功能时,他可能意识到为结构和类进行两个单独的实现是没有意义的(除了公共/私有默认可见性)。
TL/DR:在C++中,structs/classes描述了程序员拥有POD或更复杂抽象的意图,而class关键字的引入可能是出于历史原因(添加一个额外的关键字以创建功能完整的类,然后将这些特性反向移植到struct关键字中,因为实现起来更实用)。
class
只是OO中用于实例化对象的类型的常用名称。在C++中引入OO范式时,使用class
而不是struct
并不令人惊讶。
保留struct
以最大限度地提高与C.的向后兼容性
现在两者的用法与此一致:struct
最常用于C风格的POD类型,而class
用于类的OO概念。
长话短说,实际上根本不需要class
。它将默认值更改为可以说更安全、更适用于OO编程的默认值,但对于当前使用class
的任何地方,都可以使用struct
(由C++定义)(如果您想了解它的可爱和元特性,可以将struct
称为满足LSP的class
的基类)。
同时,C++中对struct
的误解非常普遍,class
更符合预期概念,因此通常更容易解释。新用户似乎经常觉得这至少稍微更容易理解——这本身就是一个合理的目标。
C++结构和C++类之间没有这样的区别,你可以像用类一样用结构执行几乎所有的函数,但结构是一个C关键字,它在C++中逐渐被修改/进化,并被命名为类。A我们在C++中,最好使用类而不是结构。
举个例子,如果你已经用C++做了一些编码,而某个在Java工作的人在2个月后来审查你的代码,他会觉得理解带"struct"的代码和带"class"的代码更舒服吗?
- 如何使用set实现无序数据结构?
- 如何从实现接口的模板化类实例访问结构
- C++ 在外部使用嵌套结构实现类函数
- C++ 中的 TRIE 数据结构实现
- 数据结构实现
- 为什么type_traits使用结构实现
- 在 c++ 中为结构实现索引器
- C 结构实现派生接口
- 为什么标准库不以无锁的方式为 8 字节以下的结构实现 std::atomic?
- 如何在 C++1x 中为类层次结构实现完全通用的访问者?
- 通过结构实现BST
- 以下 C++ 结构实现之间的区别
- STL如何用非线性数据结构实现反向迭代器去引用
- C++中的数据结构实现
- 编译器特定联合结构实现的标准替代方案
- C++指针返回结构实现:链表
- 为什么不应该以这种方式隐藏结构实现
- 理解数据结构实现代码
- 采用哪种数据结构实现双叶树类型
- c++中访问者模式的层次结构实现