代码之家  ›  专栏  ›  技术社区  ›  Shailesh Kumar

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

  •  8
  • Shailesh Kumar  · 技术社区  · 15 年前

    根据 Wikipedia :

    当一个对象:

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

    有人曾经告诉我,原始指针不是第一类对象,而智能指针如STD::AutoTypTR是。但是对我来说,C++中的一个原始指针(对于一个对象或一个函数)似乎满足了上面提到的条件,以作为第一类对象。我错过什么了吗?

    5 回复  |  直到 15 年前
        1
  •  1
  •   Partha Pratim Das    15 年前

    实际上,“指针是fco”和“指针不是fco”都是正确的。我们需要在各自的上下文中使用这些语句。(fco-一级对象)

    当我们讨论C++中的“指针”时,我们讨论的是一种数据类型,它存储了其他数据的地址。现在,这是否是FCO,实际上取决于我们如何设想使用它。不幸的是,对于C++中的指针来说,使用语义不是内置的。

    如果我们只使用指向数据的指针,那么它将满足成为一个FCO的要求。但是,如果我们使用一个指针“保留”一个数据,那么它就不能再被视为一个FCO,因为它的复制和分配语义不起作用。这样的“资源处理”指针(或更直接地称为“原始指针”)是我们在智能指针研究环境中的兴趣所在。这些不是FCO,而相应的智能指针是。相比之下,仅仅跟踪指针将继续满足FCO的要求。

    以下段落从《现代C++设计》一书中很好地阐明了这一点。

    我引用了智能指针一章:

    具有值语义的对象是 可以复制和分配的对象 去。int类型是 一类对象。你可以创造, 复制并更改整数值 自由。一个你用来 在缓冲区中迭代也有值 语义“您初始化它到点 到缓冲区的开头,以及 你把它撞到尽头。 一路上,你可以复制它的价值 到其他变量以保存临时变量 结果。

    具有保存值的指针 然而,新的故事 是非常不同的。一旦你有了 书面

    widget*p=新的widget; 变量p不仅指向内存,而且拥有内存 分配给小部件对象。这 是因为以后你必须发出删除命令 p确保小部件对象 被破坏,内存被释放。 如果排在队伍后面 显示你写的

    p=0;//给p赋值 你失去了之前P所指对象的所有权,而你 根本没有机会抓住 又来了。你有资源泄露, 资源泄漏也无济于事。

    我希望这能澄清。

        2
  •  3
  •   Michael Aaron Safyan    15 年前

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

    所有对象都是一流的语言的一个好例子是Python。在python中,所有东西都有某种类型的关联,它可以被视为一个对象,它可以有成员、函数等。作为一个极端的例子,甚至python中的函数都是只包含代码的对象,并且恰好可以被调用;实际上,如果您试图使用一个普通函数将返回函数包装器(从而不必把函数视为特殊情况)。甚至可以像向其他对象那样向函数添加成员。下面是这样一个例子:

    >>> 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表示歉意,但是没有对比就很难解释这个概念。

        3
  •  2
  •   Norman Ramsey    15 年前

    维基百科的文章很糟糕(我曾经同意“需要引用”),但你没有遗漏任何东西:根据维基百科的定义,也根据任何理智的定义, 原始C++指针是第一类对象 .

    如果有人愿意自愿帮助我通过谷歌学者进行一些搜索,我真的很想看到维基百科的文章被修复。我是一个主题专家,但我也非常忙,我很想有一个合作伙伴来解决这个问题。

        4
  •  1
  •   kriss    15 年前

    正如迈克所说,这里的“对象”这个词似乎有点混乱。你的朋友好像在“第一类对象”和“C++类的实例”这两个对象之间混淆,这两个非常不同的地方,Word对象被用于两个完全不同的事物。

    在面向对象的编程中,object这个词用于描述一些数据结构,收集数据字段和操作它们的方法。用C++在类中定义它们,获取继承等。

    另一方面,在表达“第一类对象”时,“对象”一词的含义更为广泛,不局限于面向对象语言的对象。一个整数可以作为一类对象,指针也可以。我相信,“其他对象”的另一个含义并没有真正地作为C++中的第一类对象(他们在其他面向对象编程语言中使用),因为它们对参数传递有限制(但可以传递指针或引用给它们,差异不太大)。

    然后,事情与你朋友所说的完全相反:指针是第一类对象,而不是C++类的实例,智能指针是C++类的实例,而不是第一类对象。

        5
  •  1
  •   IAbstract    15 年前

    wiki :

    在计算技术中,一类对象 (也包括价值、实体和公民) 特定的上下文 编程语言,是一个实体 可以作为参数传递, 从子程序返回,或 分配到变量中。 1 在 计算机科学 在引用进程时使用 (技术、机制)制造 一流的东西 对象。[需要引用]

    我在维基百科中加入了整个条目以供参考。根据这个定义——一个可以作为参数传递的实体——C++指针将是一个第一类对象。

    支持参数的其他链接: catalysoft wapedia

    重新确认 :指使某物成为一流物体的过程(技术、机制)。