struct和class是C++中用于定义自定义数据类型的关键字。它们可以用于创建对象,并且可以包含成员变量和成员函数。 struct关键字最早出现在C语言中,用于定义包含多个不同类型的变量的数据结构。在C++中,struct继续被用于这个目的,并且可以包含成员函数。与C语言不同,C++中的struct默认成员是公共的。 class关键字在C++中也用于定义自定义数据类型。它与struct的区别在于,默认的成员访问权限是私有的。这意味着除非明确指定为公共或保护,否则类的成员对外部是不可见的。 C++

17 浏览
0 Comments

struct和class是C++中用于定义自定义数据类型的关键字。它们可以用于创建对象,并且可以包含成员变量和成员函数。 struct关键字最早出现在C语言中,用于定义包含多个不同类型的变量的数据结构。在C++中,struct继续被用于这个目的,并且可以包含成员函数。与C语言不同,C++中的struct默认成员是公共的。 class关键字在C++中也用于定义自定义数据类型。它与struct的区别在于,默认的成员访问权限是私有的。这意味着除非明确指定为公共或保护,否则类的成员对外部是不可见的。 C++

我正在学习C++的面向对象编程课程。最近的一项作业中,我在一个struct中定义了一个成员函数。我的教师解释说,虽然在struct中使用成员函数是可编译的,但他希望我们不要这样做,以保持与C的向后兼容性,并且(尤其在这个初级课程中)要练习良好的数据封装性-我们应该将struct用于主要包含数据的类型,并且将class用于从更多的过程化封装中受益的应用程序。他表示,这种做法来自于C++中structs/classes的历史,这正是我想了解更多的内容。

我知道structs在功能上与classes相同,只是默认的成员访问和继承方式不同。我的问题是:

为什么C++中既包括structs又包括classes?根据我在C#中的背景,structs和classes有重要的区别,似乎C++中的struct只是用默认的public性质定义classes的语法糖。是这样吗?

我不是在寻找关于何时/为什么应该使用其中一个而不是另一个的观点-我在这些结构之后出生,我正在寻找它们的历史。它们是同时构思的吗?如果是这样,为什么?如果不是,哪个先出现,为什么添加第二个?我意识到在这个社区中有许多古老的长者可能对这些特性的起源有活生生的记忆,并且提供标准出版物的链接,或者代码示例,其中两者之一,或者第一个,或者第二个首次出现,都将增加答案的有用性。

请注意,这个问题不是:

0
0 Comments

struct和class在C++中的历史是什么?

C++语言中包含了struct和class,但是struct早在C语言中就存在了。

C++中包含struct是因为它们继承自C语言。没有理由将它们从C++中删除,打破现有的可能使用C++编译器进行编译的C代码库。

C++引入了class作为一个新的关键字。可以推测,引入这个关键字是为了在现有的C代码库中区分新创建的C++类和现有的struct。

完全不同意“更有意义”。

我不了解得足够多,无法同意或不同意,但是你所说的“更有意义”对我来说不太清楚。你能详细解释一下吗?

0
0 Comments

C++的struct/class历史起源于上世纪80年代末到90年代初的时期。当时的C++编译器(称为cfront)将C++代码转换为C代码。那个时候的C++与当前的C++11或C++14(甚至旧的C++03)有着很大的不同。

具体细节我记不清了,但可能发生的情况是,当时的struct被完整解析,但在生成的C代码中不做任何更改,而class则被预处理成不同的形式(被翻译成struct)。

我可能完全记错了,这只是我的人类记忆,而且我只是在SunOS3,Sun3/160工作站上使用过cfront几次。它给我留下了不太深刻的印象,但也引起了我的兴趣。当时,转换为C代码会给构建过程添加很长时间。但是现在情况已经大不相同,将其转换为C代码在今天是有很多意义的...

(在那个时代,一个Ada的hello world程序需要5分钟才能编译完成,而使用cfront可能只需要3分钟,但是用C语言不到一分钟)

后来,C++的定义发生了变化,struct foo {确实等同于class foo{ public:,但我不确定在最早的C++编译器中是否是这样。

这并不矛盾:cfront可以完整解析C++代码,并将struct和class都输出为struct。

0
0 Comments

在C++中,structclass的历史起源于C语言。C和C++是两种独立的语言,但C++语言的设计目标是与C语言提供一个大而有用的公共子集。在C++中,struct被定义为class的一种语法糖,近似于C语言中的struct,即成员默认为public。因此,可以在这个公共子集中编写程序或程序的一部分。这可以让一个库提供一个单独的头文件,同时向使用C语言和使用C++语言编写的程序声明相同的API。

C语言和C++语言之间存在一些差异,这些差异可以被视为"实现定义的行为",其中C语言的编译器产生一种行为,而C++语言的编译器产生另一种行为。事实上,C++标准提供了一些机制来帮助开发在C和C++语言中都有效的多语言程序。extern "C"联接指示符允许程序部分使用C语言,部分使用C++语言。而__cplusplus符号则用于#ifdef __cplusplus条件中,以有条件地启用只有其中一种语言才能看到的宏、联接指示符和其他特定内容。

这些差异通常是微妙的。告诉初学者存在一个公共子集而不明确是哪个子集是危险的。更好的做法是将它们视为不同的语言。

通过上述机制,可以在C和C++之间进行多语言编程,这是因为它们具有一个相当大且有用的公共子集。这种多语言编程是可能的。

C++标准库必须提供C标准库头文件,这是C++代码可以混入C代码的明确迹象,即使只是为了兼容性的缘故。还有许多C++库没有提供的功能最终以C语言实现(通常包装在C++中)。网络编程就是一个重要的例子,没有标准的C++网络编程功能。这取决于是否将库包含在此讨论中。

#ifdef __cplusplus的存在以及用于多语言头文件的extern "C"联接指示符是支持多语言编程的证据。这表明C++提供了明确的工具来创建多语言程序。而Fortran则不同。至于asm,如果asm的内容被某个标准涵盖,情况将会不同。

总之,C++的structclass的历史起源于C语言,并且C++提供了一些机制来支持在C和C++之间进行多语言编程。这样的多语言编程是可能的,因为C++和C之间存在一个有用的公共子集。

0