当我学习具有C背景的C ++时,我想到了这个问题。即使有struct
为什么Stroustrup认为有必要引入class
关键字?我当时试过问过人,但得不到满意的答复。那么Stack Overflow社区可以回答它吗?
答案 0 :(得分:36)
正如David所说,默认情况下,结构是公共的,默认情况下类是私有的。更重要的一点是,向C添加面向对象是一个很大的变化,并且让开发人员准确表达自己的方式是设计语言的重要部分。
事实证明,从技术角度来看,struct和class之间的区别很小(default-public vs default-private),但在程序员看来,区别非常大。添加关键字是强调C ++ OO特性的重要方法。
答案 1 :(得分:22)
在The Design and Evolution of C++中,在描述如何开发C ++的对象模型和虚函数时,他写道(第76页):
此时,对象模型变得真实,因为对象不仅仅是类的数据成员的简单聚合。具有虚函数的C ++类的对象是与简单的C`struct`完全不同的野兽。那么为什么我现在不选择结构和类别不同的概念呢?
我的意图是拥有一个单一的概念:一组布局规则,一组查找规则,一组解析规则等......我确信如果`struct`意味着“C”并且“对用户和`class`的兼容性意味着”C ++和高级功能“,社区将陷入两个不同的阵营,很快就会停止沟通。在设计课程时,能够根据需要使用尽可能多的语言功能对我来说是一个重要的想法。只有一个概念可以支持我从“传统的C风格编程”到类抽象,到面向对象编程的平滑和渐进过渡的想法。只有一个概念可以支持“你只需支付你使用的东西”的理念。
所以听起来引入了class
关键字来表示C ++特定的面向对象,然后引入了它与struct
关键字的兼容性。
答案 2 :(得分:5)
修改强>
虽然下面的猜测是合理的,但两个关键字的原因可能是实际的:通过保持struct 向后兼容的语法和语义,可以引入C ++很容易进入现有程序(而不是重新访问所有结构并将关键字'public'添加到它们中......)。
[推测]我有两个关键词的事实可能与新语言的起源有关,最初OO特征与新关键词“class”完全相关。随着这个成熟,我们决定在结构中引入一些OO功能并保持这些功能也很方便......
该结构用于完全或大多数透明的“对象”,没有/很少数据隐藏或行为,延续其非面向对象的使用(尽管这种透明结构在OO程序的更广泛的上下文中占有一席之地) )。因此,课程旨在引入数据隐藏和其他OO实践。
另一种选择可能是对两种用法使用struct关键字,要求程序员在其“类”意义上将其置于显式定义私有成员。在程序员社区中没有广泛理解OO概念的时候(参见本文中的其他回复),可能认为单独的关键字可以更好地帮助“社交”新功能/概念。
答案 3 :(得分:4)
已经给出了字面答案:“默认情况下,struct成员是公共的,默认情况下类成员是私有的”。大多数程序员明确地将他们所有的部分标识为私有,受保护或公开。
从字面上讲,对于一个你无法使用typedef结构的类,你无能为力。
然而,许多C ++用户使用“struct”来识别“plain old data structures”的C ++实体。 PODS的概念是一个非常有用的C ++概念 - PODS很容易构建,复制和“没有惊喜”,而类更危险。
例如,PODS可以在编译时初始化为数组,这使得它们对静态表非常有用。
所以我强烈建议你遵循相同的约定 - 结构是PODS,其他任何东西都是一个类。
答案 4 :(得分:2)
C ++的原始设计师Bjarne Stroustrup受到Simula编程语言的强烈启发。这就是他获得阶级概念和名称“阶级”的地方。
如引用“设计与进化”的答案中所述,Bjarne问自己的真正问题不是“为什么要引入类关键字?”。相反,他问“一个结构的行为应该与一个类似吗?”。 Bjarne决定他们应该。 This article from 1997认为他做出了错误的决定。