为什么函数不是对象?有什么不同?
为了理解这一点,让我们从所涉及的抽象方面从下到上移动。所以,您有自己的地址空间,您可以通过它定义内存的状态,我们必须记住,从根本上说,这一切都与您操作的状态有关。
好的,让我们在抽象方面提高一点。我还没有考虑编程语言强加的任何抽象(像对象、数组等),只是作为一个外行,我想记录一部分内存,让我们称之为Ab1 和另一个叫 Ab2。
两者基本上都有一个状态,但我打算以不同方式操纵/利用状态。
不同...为什么以及如何?
为什么?
由于我的要求(例如,执行 2 个数字的加法并将结果存储回来)。我将使用Ab1 作为长期使用状态,Ab2 作为相对较短的使用状态。所以,我将为Ab1(添加两个数字)创建一个状态,然后使用这个状态来填充Ab2的一些状态(暂时复制它们 >) 并对Ab2(添加它们) 执行进一步操作,并将生成的Ab2 的一部分保存到Ab1(添加的结果)。发布 Ab2 变得无用,我们重置它的状态。
怎么做?
我将需要对这两个部分进行一些管理,以跟踪从Ab1 中选择哪些单词并复制到Ab2 等等。在这一点上,我意识到我可以让它执行一些简单的操作,但一些严重的事情需要一个布局规范来管理这个内存。
所以,我寻找这样的管理规范,结果发现存在多种这样的规范(有些具有内置的内存模型,有些提供了自己管理内存的灵活性)更好的设计。事实上,因为他们(甚至没有直接规定如何管理内存)已经成功地定义了这个长寿命存储的封装以及如何以及何时创建和销毁它的规则。
Ab2 也是如此,但他们呈现它的方式让我觉得这与Ab1 有很大不同。事实上,事实证明确实如此。他们使用堆栈对Ab2 进行状态操作,并从堆中为Ab1 保留内存。 Ab2 一段时间后死掉。(执行完成后)。
此外,您定义如何处理Ab2 的方式是通过另一个名为Ab2_Code 的存储部分完成的,Ab1 的规范同样涉及Ab1_Code
我想说,这太棒了!我得到了很多便利,可以解决很多问题。
现在,我仍然是从外行的角度来看,所以我对经历了这一切的思考过程并不感到惊讶,但如果你从上到下质疑事情,事情可能会变得有点难以透视。 (我怀疑你的情况就是这样)
顺便说一句,我忘了提到 Ab1 被正式称为 object 而 Ab2 是一个 函数堆栈 而 Ab1_Code 是 类定义 和Ab2_Code 是函数定义代码。
正是由于 PL 强加的这些差异,你会发现它们是如此不同。(你的问题)
注意:不要将我对Ab1/Object 的表示作为规则或具体事物的长存储抽象 - 这是从外行的角度来看的。编程语言在管理对象的生命周期方面提供了更大的灵活性。因此,对象可以像Ab1 一样部署,但也可以更多。
这与函子(函数对象)有什么关系吗?
请注意,第一部分的答案通常对许多编程语言(包括 C++)有效,这部分与 C++(您引用的规范)有关。所以你有一个函数的指针,你也可以有一个对象的指针。它只是 C++ 定义的另一种编程结构。请注意,这是关于拥有一个指向Ab1、Ab2 的指针来操作它们,而不是使用另一个不同的抽象来操作。
你可以在这里阅读它的定义和用法:
C++ Functors - and their uses