根据维基百科:
当一个对象满足以下条件时,它就是一流的:
- 可以存储在变量和数据结构中
- 可以作为参数传递给子例程
- 可以作为子例程的结果返回
- 可以在运行时构造
- 具有内在身份(独立于任何给定名称)
有人曾经告诉我,原始指针不是第一类对象,而像 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(使用前将#替换为@)