【问题标题】:What is the difference between: Handle, Pointer and Reference有什么区别:句柄、指针和引用
【发布时间】:2012-10-12 23:16:13
【问题描述】:

句柄与指向对象的指针有何不同?为什么我们不能有对引用的引用?

【问题讨论】:

  • 引用引用有什么作用?
  • 什么是 cpp 上下文中的“句柄”。我没有找到任何有用的链接。
  • 我刚刚意识到我没有在这里勾选答案 哎呀。我从堆栈溢出中学到了很多东西。非常感谢你们:)

标签: c++ oop pointers reference handle


【解决方案1】:

区别在于上下文。

句柄的基本含义是它在非常有限的上下文中引用某个对象;例如。一个操作系统只能为一个用户或 pid 打开 20 个文件。指针在“内存”的上下文中引用相同的对象。而reference是一个对象的“别名”——它指的是源代码上下文中的一个对象;因此对引用的引用不存在,因为引用已经“是”对象。

【讨论】:

    【解决方案2】:

    甚至问这个问题,“为什么我们不能引用引用?”表示您不了解什么是参考

    引用是对象的另一个名称;而已。如果我有一个对象存储在变量 X 中,我可以创建一个变量 Y,它是对该对象的引用。他们都在谈论同一个对象,那么引用 Y 到底意味着什么?这与引用 X 没有什么不同,因为它们都引用了相同的东西。

    就 C++ 语言而言,“句柄”没有定义。一般来说,“句柄”是代表某种资源的某种形式的构造。您可以从一些创建资源的 API 中获取它。您调用将句柄作为参数的函数,以查询或修改资源的状态。完成后,您可以将其提供给其他 API 函数。

    指针可以是句柄。引用可以是句柄。一个对象可以是一个句柄。 整数 可以是句柄。这完全取决于实现句柄的系统想要用它做什么。

    【讨论】:

    • 因为引用是命名约定,所以不能是句柄。它是语法糖,因此可以找到参考参考的理由。一个可以例如传递一个整数作为引用,但使用对函数参数的引用,同时将其提升为无符号整数。由于原始对象在函数范围内不可见,因此您实际上会在语法上引用引用。从语义上讲,这相当于 union.
    【解决方案3】:

    句柄通常是对对象的不透明引用。句柄的类型与引用的元素无关。例如,考虑open() 系统调用返回的文件描述符。类型是int,但它表示打开文件表中的一个条目。存储在表中的实际数据与open() 返回的int 无关,从而使实现不必维护兼容性(即可以透明地重构实际表而不影响用户代码。句柄只能由函数使用在同一个库接口中,可以将句柄重新映射回实际对象。

    指针是内存中的地址和驻留在该内存位置的对象类型的组合。该值是地址,指针的类型告诉编译器可以通过该指针执行哪些操作,如何解释内存位置。指针是透明的,因为引用的对象具有指针中存在的具体类型。请注意,在某些情况下,指针可以用作句柄(void* 完全不透明,指向空接口的指针同样不透明)。

    引用是对象的别名。这就是为什么你不能有一个引用的引用:你可以有一个对象的多个别名,但你不能有一个别名的别名。与指针一样,引用是类型化的。在某些情况下,编译器可以将引用实现为在使用时自动取消引用的指针,在某些其他情况下,编译器可以具有没有实际存储的引用。重要的部分是它们是对象的别名,它们必须使用对象进行初始化,并且在初始化后不能重新定位以引用不同的对象。一旦它们被初始化,引用的所有使用都是对真实对象的使用。

    【讨论】:

      【解决方案4】:

      handle 有时也被称为“魔法饼干”。它只是标识对象的某种不透明类型的值。在某些情况下,它被实现为一个实际的指针,所以如果你将它转换为一个指向正确类型的指针,你可以取消引用它并使用它指向的任何类型的东西。

      在其他情况下,它将被实现为指针以外的东西——例如,您可能有一个该类型对象的表,而句柄实际上只是该表的索引。除非你知道表的基地址,否则你不能对索引做很多事情。

      C++ 只是说引用引用是不可能的。没有太多“为什么”的方式——如果他们非常想这样做,他们无疑可以允许它(以及引用数组,就此而言)。然而,决定最好限制引用(很多),所以他们就是这样做的。

      【讨论】:

        猜你喜欢
        • 2010-09-30
        • 2018-12-15
        • 2011-04-04
        • 2010-12-17
        • 2013-07-12
        • 2022-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多