【问题标题】:Definition of object and instantiation对象的定义和实例化
【发布时间】:2019-12-28 07:38:37
【问题描述】:

根据What is a Class and Object in C++?

一个类就像一个蓝图,一个对象就像一个用它建造的房子 蓝图。

您可以拥有许多具有相同布局/平面图的房屋(阅读类), 但每个都是它自己的实例(读取对象)。每个人都有自己的主人, 家具等

请注意,还有一些对象的蓝图不是类(例如 整数)。

总而言之,有不同类型的对象(例如 int、float 等)。您可以创建用户定义的类型,称为“类”。

在 C++ 中,术语对象用于任何类型的实例,包括类和基本类型。

但是,根据http://www.cplusplus.com/doc/tutorial/classes/

对象是类的实例化。在变量方面,一个 类是类型,对象是变量。

这个说法是不是不准确?对象可以是类的实例化,但也可以是基本类型的实例。

那么什么是实例化? 创建一个基本类型的实例(例如int x = 3;)是否被视为“实例化”?因为它在技术上是创建一个类型的实例。

【问题讨论】:

  • cplusplus.com 有很多这样的不准确之处,在这里你会发现有人建议避免它

标签: c++ class object definition object-lifetime


【解决方案1】:

一个对象是一个类型的一个实例。

继续你的问题:

那句话(cppreference 之一)不是不准确的吗?一个对象可以是一个实例 一个类,但它也可以是一个基本类型的实例。

你是对的。

另外,不会创建基本类型的实例(例如 int x = 3;) 被认为是“实例化”?因为它在技术上创造了一个 类型的实例。

再次,正确。


个人建议:不要过分担心确切的定义,把更多的精力花在“通过编写代码来学习”上

如何定义实例化?

好吧,既然你这么坚持,那我就请客反击吧:

您在网上或书中找到的所有定义都不具有权威性。这些事情的唯一权威是 C++ 标准:这里看一看:N4713。如您所见,该标准过于技术性且难以解析和理解。之所以这样,是因为它绝不是用来学习的,它是为了彻底而明确地定义语言的语法和语义。它是编译器实现者在编写用于将甜蜜的 C++ 源代码转换为机器代码的编译器时所转向的文档。

由于标准不是学习 C++ 的一种方式,因此每个人都提出了自己的定义和术语,以便更容易地传达有时更复杂的问题。这样做时,有时您看到的定义是不完整的,或稍有错误,或不适用于奇怪的极端情况。您会发现不同作者使用相同的术语略有不同。这是坏事吗?也许,但不是很多。在学习时,掌握简单的概念和工具非常重要,这样您就可以一步一步地完成任务。失去那种“严谨彻底”是要付出很小的代价,恕我直言,但我知道这会让那些非常认真地对待学习材料中的每一个字的人感到困惑。

回到您的问题:在标准中,据我所知,术语“实例化”在这个意义上没有使用,它用于“模板实例化”,这是另一回事。

不过没关系,我们不需要标准来理解一个简单的概念。对于您的上下文,实例化是对象的创建。这是一个非常简单的概念,不要想太多。

C++ 标准将“实例化”用于不同的目的,但您仍然可以理解这个概念。如果你愿意,可以给它起个别的名字。

【讨论】:

  • 标准也不是权威的。它充满了不一致、明显的问题;最终编译器作者的直觉是权威的。
  • @curiousguy 我强烈反对。它可能有缺陷并且包含不一致(我不知道是否充满),但它是由国际标准化组织维护的标准。它具有权威性。
  • 请指出一个例子,std 不同意知识渊博的程序员的常识和直觉,std 最终获胜。
  • @curiousguy "权威:来自官方来源并要求遵守或服从"
  • 没有编译器能够遵循转换为基类的指针仍然指向最派生对象的荒谬想法。没有用户程序符合您不能使用字符串文字的想法,永远(因为它的生命周期永远不会开始)。或者您无法编写任何 MT 程序,因为没有定义 MT 语义,因为定义它的唯一方法是通过顺序一致性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 2013-04-02
相关资源
最近更新 更多