原始 C++ 指针是第一类对象吗?

2023-11-27

根据维基百科:

当一个对象满足以下条件时,它就是一流的:

  • 可以存储在变量和数据结构中
  • 可以作为参数传递给子例程
  • 可以作为子例程的结果返回
  • 可以在运行时构造
  • 具有内在身份(独立于任何给定名称)

有人曾经告诉我,原始指针不是第一类对象,而像 std::auto_ptr 这样的智能指针则是。但对我来说,C++ 中的原始指针(指向对象或函数)确实满足上述条件,有资格成为第一类对象。我错过了什么吗?


维基百科中“一流”的定义是不正确的。在编程语言中,如果一个实体不需要编译器进行任何特殊处理并且可以像该语言中的任何其他对象一样被解释、理解、使用等,则该实体被认为是“一流”的。 C++ 中的指针不是第一类对象的原因是*p对于一个指针p不被解释为简单地调用重载运算符*,就像对任何其他对象一样;相反,编译器必须处理p特别基于它是指针类型这一事实。当传递指针或引用时,您不能简单地传递任何值对象(其中一些值对象恰好是指针),但您实际上是在说它是不同的类型(指针类型或引用类型,而不是值类型),其解释/使用取决于其类型。

所有对象都是一流的语言的一个很好的例子是 Python。在Python中,一切都有某种与之关联的类型,它可以被视为一个对象,它可以有成员、函数等。作为一个极端的例子,即使Python中的函数也是简单包含代码并且恰好是可调用的对象;事实上,如果您尝试使用 __call__ 成员函数(类似于 C++ 中的重载operator(),其他非函数对象可以提供)来调用该函数,普通函数将返回一个函数包装器作为结果(这样您就不必将函数视为特殊情况)。您甚至可以像向其他对象添加成员一样向函数添加成员。这是这样一个例子:



>>> def f(x):
...     return x;
... 
>>> func = f;
>>> print f.__class__

>>> print f(5)
5
>>> print f.__call__(5)
5
>>> f.myOwnMember = "Hello world!"
>>> print f.myOwnMember
Hello world!
  

我为 C++ 帖子中的 Python 表示歉意,但如果没有对比,很难解释这个概念。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原始 C++ 指针是第一类对象吗? 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 如何使用 Smack 了解 XMPP openfire 中的打字状态

    我正在使用 Openfire XMPP 服务器开发聊天应用程序 我可以在两个用户之间进行文字聊天 但我想知道有人正在输入消息时的输入状态 所以我创建了一个类 public class typingStatus implements Chat
  • 如何使用PHPWord将html标签字符串转换为word文档?

    我有一个 HTML 字符串 我想以与 HTML 中相同的格式和样式在 Word 文档中打印 我正在使用PHPWord 当我给出 HTML 字符串时 htmlval h6 div style text align center b OFFER
  • SQL Server 中类似 QUALIFY 的函数

    我的表有 2 列 Emp Name and Emp NR 有可能发生这样的情况Emp Name值有 2 个不同Emp NR values 我想创建一个SELECT仅获取单个值的语句Emp Name and Emp NR 该语句应类似于 Te
  • HttpClient 不返回 Content-Type

    我正在发送请求HttpClient 服务器返回两个我想返回给客户端的标头 我这样运行 using var client new HttpClient var response await client GetAsync DownloadUr
  • .NET Core 3.1 ChangePasswordAsync 内部异常“无法更新身份列”

    我正在将 NET Core Web API 从 2 2 升级到 3 1 当测试时ChangePasswordAsync函数时 我收到以下错误消息 无法更新身份列 UserId 我运行了 SQL 配置文件 可以看到 Identity 列未包含
  • Django:“项目”与“应用程序”

    我有一个相当复杂的 产品 我正准备使用 Django 构建 我将避免在这种情况下使用术语 项目 和 应用程序 因为我不清楚它们在 Django 中的具体含义 项目可以有许多应用程序 应用程序可以在许多项目之间共享 美好的 我没有重新发明博客
  • 如何从nodejs aws s3 getObject回调数据中检索元数据?

    我正在尝试使用 AWS 节点 SDK 将音频块文件上传到 S3 或从 S3 下载音频块文件 我尝试过base64方法 效果很好 但我无法取回我作为上传参数的一部分捆绑的元数据 下面是上传的代码片段以及元信息 var myMetaInfo A
  • kubeadm:主节点从未准备好

    我正在跟进一篇博文使用 kubeadm 设置 kubernetes 集群 因此 我使用桥接网络创建了一个 Virtualbox 然后只需按照说明进行操作即可 我最初只是做了kubeadm init它不起作用 master NotReady
  • Python/Tkinter:动态扩展字体大小以填充框架

    我知道您可以通过以下命令让框架小部件扩展并填充其容器中可用的所有区域 frameName pack fill both expand True 对于文本的字体大小有何作用 目前我的文本是标签小部件的属性 标签小部件的父级是frameName
  • 为什么 GCC 允许在 C++ 中使用 round(),即使带有 ansi 和 pedantic 标志?

    即使使用 ansi and pedantic flags include
  • 未设置设计密钥

    我正在开发一个 Rails 4 应用程序 使用 Active Admin gem 作为管理后端 Active Admin 反过来使用 Devise 进行用户身份验证 现在 当我尝试使用部署应用程序时capistrano在 VPS 服务器上
  • Yii 将过滤器添加到 CGridView 中的虚拟属性并使其可排序

    我有以下型号 User包含列 id user name password user type Admin包含列 id user id full name etc Editor包含 id user id full name etc 列 关系是
  • 浮动 div 而不定义 height 属性

    它看起来很简单 也许是 只是被卡住了 gt 只是为了好玩 现在没有实际需要 我懂了 div class master div class left p LEFT p div div class right p Lorem ipsum dol
  • 将列表转换为字典[重复]

    这个问题在这里已经有答案了 l a b c d e 我想将此列表转换为字典 例如 d a b c d e 所以基本上 偶数将是键 而赔率将是值 我知道我可以用 非Pythonic 的方式来做到这一点 例如带有if语句的for循环 但我相信应
  • IExtensionConfigProvider 未初始化或与 Microsoft.Azure.WebJobs v3 绑定

    我们通过与 IExtensionConfigProvider 的参数绑定在 Azure 函数 netstandard20 上的 v2 中使用依赖项注入 将 Microsoft NET Sdk Functions 从 1 0 13 升级到 1
  • tkinter:键盘中断需要一段时间

    在 Linux 上使用 Tkinter 和 Python 我试图通过使用KeyboardInterrupt例外 但是当我按下它时 有一段时间没有任何反应 最终它 接受 并退出 示例程序 import sys from Tkinter imp
  • R中的负下标错误

    我有以下代码片段 if k lt 100 k gt 0 j k seq 50 150 lt F else j k seq 100 100 lt F 并出现以下错误 j k seq 50 150 即使我已经设置了条件 如果下标可能 为什么我会
  • Cakephp Sqlserver 编码

    这让我难住了 我正在尝试为我的 Sqlserver 连接设置编码 但我尝试的所有操作都失败了 我只得到 错误 使用 Sqlserver 的数据库连接丢失或无法连接 连接 数据库服务器返回此错误 SQLSTATE IMSSP 指定的编码无效
  • 使用 PHP 操作 MySQL 中的 utf8mb4 数据

    这大概是一件很简单的事情 我发誓我一直在网上寻找答案 但还没有找到 由于我的具体情况有点不典型 我最终决定在这里提问 我在 MySQL 中有一些表用于中文程序 它需要能够支持所有可能的汉字 包括没有很好字体支持的罕见汉字 表中的示例单元格可
  • 原始 C++ 指针是第一类对象吗?

    根据维基百科 当一个对象满足以下条件时 它就是一流的 可以存储在变量和数据结构中 可以作为参数传递给子例程 可以作为子例程的结果返回 可以在运行时构造 具有内在身份 独立于任何给定名称 有人曾经告诉我 原始指针不是第一类对象 而像 std