为什么函数不是对象?

沙迪:

我读了标准n4296(Draft)§1.8第7页:

一个对象是存储的区域。[注意:函数不是对象,无论它是否以对象的方式占用存储空间。—尾注]

我花了几天时间在网上寻找被排除在外的好理由,没有运气。也许是因为我没有完全理解对象。所以:

  1. 为什么函数不是对象?有何不同?
  2. 并且这与函子(函数对象)有关系吗?
杰里·科芬(Jerry Coffin):

很多区别归结于指针和寻址。在C ++¹中,指向函数的指针和指向对象的指针严格是分开的。

C ++要求您可以将任何对象类型的指针void转换为的指针,然后将其转换回原始类型,其结果将等于以“²”开头的指针。换句话说,不管它们到底是怎么做的,实现都必须确保从指针到对象类型到指针到无效的转换是无损的,因此无论原始内容是什么,包含的任何信息都可以被重新创建,这样您可以通过从T*void *返回到返回来找回与开始时相同的指针T*

不是一个指向函数的指针,虽然真正的-如果你把一个指向函数的指针,将其转换为void *,然后将其转换回一个指向函数的指针,你可能会失去在这个过程中的一些信息。您可能不找回原始指针,而取消引用所做的取回操作会给您带来不确定的行为(总之,请勿这样做)。

不管怎样,您都可以将一个函数的指针转换为另一种类型的函数的指针,然后将结果转换回原始类型,并确保结果与开始时相同用。

尽管它与手头的讨论并不特别相关,但还有一些其他差异可能值得注意。例如,您可以复制大多数对象,但是不能复制任何功能。

就与功能对象的关系而言:其实,除了一点之外,没有太多的东西:一个功能对象支持看起来像一个函数调用的语法,但是它仍然是一个对象,而不是一个函数。因此,指向功能对象的指针仍然是指向对象的指针。例如,如果将转换为void *,然后将其转换回原始类型,则仍然可以保证您会返回原始指针值(对于函数的指针而言,这不是正确的)。

关于为什么函数指针与对象指针(至少潜在地)不同的原因:它的一部分归结于现有系统。例如,在MS-DOS(以及其他)上,有四个完全独立的内存模型:小型,中型,紧凑型和大型。小型模型对功能或数据使用16位寻址。媒介使用16位地址存储数据,使用20位地址存储代码。Compact将其反转(代码的16位地址,数据的20位地址)。大量用于代码和数据的20位地址。因此,在紧凑模型或中型模型中,在指向代码的指针和指向函数的指针之间进行转换确实会并且确实会导致问题。

最近,相当数量的DSP已将完全独立的存储器总线用于代码和数据,并且(与MS-DOS存储器模型一样)它们的宽度通常是不同的,在这两种情况之间进行转换并确实会丢失信息。


  1. 这些特殊的规则来自C语言,因此C语言也是如此,无论其值多少。
  2. 尽管不是直接要求的,但不管事情如何,对于从原始类型到指向char和返回的指针的转换,实际上都是一样的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Javascript

为什么此对象“ forEach不是函数”?

来自分类Dev

C ++为什么变量是函数而不是对象?

来自分类Dev

为什么 .indexOf 不是数组对象的函数?

来自分类Javascript

为什么函数的自变量不是JavaScript中的数组对象?

来自分类Dev

为什么我的对象的值是函数而不是字符串?

来自分类Dev

为什么将对象的副本用作函数的参数?为什么const ref不是默认的参数方式?

来自分类Dev

为什么.every()不是函数?

来自分类Dev

为什么 getState() 不是函数?

来自分类Dev

为什么我导出的函数不是函数?

来自分类PHP

为什么不与对象,而不是阵列中使用时`键()`函数触发警告或错误?

来自分类Java

为什么LocalDate,LocalTime和Stream对象使用工厂方法of()而不是构造函数?

来自分类Dev

为什么我的Dart构造函数返回一个动态而不是类型化的对象?

来自分类Dev

为什么会收到“被调用对象0不是函数错误”的信息?

来自分类Dev

为什么 React 说“Invalid prop `children`”类型是对象不是函数?

来自分类Dev

尝试进行申请时,为什么会收到消息“对象不是函数”?

来自分类Dev

为什么需要在对象中的函数中的if语句中的“ this”内部而不是外部?的JavaScript

来自分类Dev

为什么我的HTML构造函数对象返回[object Object]而不是[HTMLElementElement]?

来自分类Dev

为什么这个变量不是对象?

来自分类Python

为什么范围对象“不是迭代器”?

来自分类Javascript

为什么FileList对象不是数组?

来自分类Dev

为什么__proto__不是对象

来自分类Dev

为什么SQL返回数组而不是对象?

来自分类Dev

为什么jQuery返回整数而不是对象?

来自分类Dev

为什么“ undefined为null或不是对象”?

来自分类Dev

为什么“ this”指向类而不是类对象?

来自分类Python

为什么[0]是不同的函数,但0不是?

来自分类Dev

deligation.addEventListener 不是函数 - 为什么

来自分类Dev

原型方法不是函数,为什么?

来自分类Dev

为什么 fromkeys 是方法而不是内置函数?

Related 相关文章

  1. 1

    为什么此对象“ forEach不是函数”?

  2. 2

    C ++为什么变量是函数而不是对象?

  3. 3

    为什么 .indexOf 不是数组对象的函数?

  4. 4

    为什么函数的自变量不是JavaScript中的数组对象?

  5. 5

    为什么我的对象的值是函数而不是字符串?

  6. 6

    为什么将对象的副本用作函数的参数?为什么const ref不是默认的参数方式?

  7. 7

    为什么.every()不是函数?

  8. 8

    为什么 getState() 不是函数?

  9. 9

    为什么我导出的函数不是函数?

  10. 10

    为什么不与对象,而不是阵列中使用时`键()`函数触发警告或错误?

  11. 11

    为什么LocalDate,LocalTime和Stream对象使用工厂方法of()而不是构造函数?

  12. 12

    为什么我的Dart构造函数返回一个动态而不是类型化的对象?

  13. 13

    为什么会收到“被调用对象0不是函数错误”的信息?

  14. 14

    为什么 React 说“Invalid prop `children`”类型是对象不是函数?

  15. 15

    尝试进行申请时,为什么会收到消息“对象不是函数”?

  16. 16

    为什么需要在对象中的函数中的if语句中的“ this”内部而不是外部?的JavaScript

  17. 17

    为什么我的HTML构造函数对象返回[object Object]而不是[HTMLElementElement]?

  18. 18

    为什么这个变量不是对象?

  19. 19

    为什么范围对象“不是迭代器”?

  20. 20

    为什么FileList对象不是数组?

  21. 21

    为什么__proto__不是对象

  22. 22

    为什么SQL返回数组而不是对象?

  23. 23

    为什么jQuery返回整数而不是对象?

  24. 24

    为什么“ undefined为null或不是对象”?

  25. 25

    为什么“ this”指向类而不是类对象?

  26. 26

    为什么[0]是不同的函数,但0不是?

  27. 27

    deligation.addEventListener 不是函数 - 为什么

  28. 28

    原型方法不是函数,为什么?

  29. 29

    为什么 fromkeys 是方法而不是内置函数?

热门标签

归档