对象和实例之间的区别:C++

joe*_*han 5 c++ oop object instance

我在SO上发表了一些帖子,最后我得出的结论是,当我们有类似的东西:

Person name;
Run Code Online (Sandbox Code Playgroud)

name是一个阶级的对象person.

它实例化时成为实例:

name=new Person();
Run Code Online (Sandbox Code Playgroud)

我是C++的初学者,到目前为止我已经看到我们可以访问函数和变量,如:

Person name;
name.getValue;
name.callFunction();
Run Code Online (Sandbox Code Playgroud)

我们不需要使用new运算符.那么我们可以说在C++中可以忽略对象和实例之间的区别因素吗?

Yak*_*ont 9

在C++中,"对象"和"实例"几乎可以互换使用.

有一个通用的编程设计模式classinstance.在class保存有关的所有信息instance中,且s class.

在C++中,当你声明一个classor时struct,编译器会生成描述你如何创建它instance的代码,class数据布局是什么,并提供一些可用于与之交互的方法instance(包括破坏).

virtual方法和继承似乎将一些方法和布局移动到实例:但数量非常有限.相反,每个实例都保存指向virtual类数据的指针.在某些语言中,您可以在运行时替换实例的单个方法:但不能在C++中替换.

当你创建一个classstruct它的实例时,它可以通过堆栈上的自动命名变量(如Foo f;),匿名自动命名变量(如some_function( Foo(17,22) )),免费商店中的实例(如new Foo(17, 22)),或通过放置 - new(这是如何std::vectorstd::make_shared创建实例).

令人困惑的是,有一个单独的并行class- instance图案在C++ - - .class template classclass templateclass,该实例是实例.该template参数和专业化指示如何,在编译时,你可以在"构造"的classES.class templates 上的模式匹配提供了与实例无关的有限数量的属性(模式中的"类属性").(可以说函数模板函数是模式的另一个实例).

如果你看一下C++ 1y关于概念精简的提议,你会看到对象和实例在C++中可能意味着不同的东西.

int x = 0;
int& foo = x;
int* bar = &x;
Run Code Online (Sandbox Code Playgroud)

x既是对象又是类型的实例int.

foo是类型的实例int&,但调用foo对象可能是错误的!它是一个引用 - 别名,或某个对象的不同名称(在本例中x).

bar是一个指向an的指针int,它是一个类型的实例int*,并且将其称为对象可能是正确的.

这是一个有用的区别:如果类型是引用类型,则类型不必表示对象类型.对象类型在许多重要方面的行为与引用类型不同.

现在,一些类型具有"引用语义",因为它们在许多方面表现得像引用,但实际上是classes.这种类型的实例更好地称为引用或对象吗?在可怕的情况下,某些实例混合了引用和对象语义:这通常是一个坏迹象.

通过3.9 [类型]中的最新标准,我们在C++中有各种类型.它们描述了对象类型是什么:

类型描述对象(1.8),引用(8.3.2)或函数(8.3.5)

对象类型是(可能是cv限定的)类型,它不是函数类型,不是引用类型,也不是void类型.

因此,调用函数类型或引用类型"对象"的事物的"实例"似乎是不正确的.请注意,访问函数或引用实例的"表示"基本上是不可能的:引用别名到它们引用的对象中,并使用函数的名称衰减为指向函数的指针(和指向函数的指针基本上是不透明的句柄,可以让你调用它们.

所以可以说函数不是实例,引用不是实例.

第三方面,我们讨论class templates和函数templates的实例化.14.7是"模板实例化和专业化",实例化(a template)的点都是标准的正式术语.


小智 5

对象和实例是同一事物的两个词。


Chr*_*ckl 5

首先,您应该知道“对象”和“实例”之间没有区别。它们是同义词。在C ++中,您还调用基本类型的实例,例如intdouble“对象”。C ++的设计原则之一是可以使自定义类型(即类)的行为与原始类型完全相同。实际上,在C ++中,人们通常更喜欢引用“类型”而不是“类”。

因此,它应该是类型对象。既然我们已经解决了这个问题,恐怕我必须告诉您您的结论是错误的。

Person是一种类型name是用于访问该类型对象的(不是很好命名的)变量。

一整行C ++代码如下所示:

Person name;
Run Code Online (Sandbox Code Playgroud)

这意味着:“创建一个Person类型的对象,然后让我通过name变量访问它”。

new Person()更复杂。您可能熟悉newJava之类的语言中的关键字,但是在C ++中,它是完全不同的野兽。这意味着将Person创建一个新的类型的对象,但也意味着您有责任在以后销毁它。它还为您提供了新创建对象的另一种句柄:所谓的指针。一个Person指针看起来是这样的:

Person*
Run Code Online (Sandbox Code Playgroud)

指针本身是一个类型,类型Person*Person不兼容。(我告诉过你,这会复杂得多:)

当您尝试编译以下行时,您将注意到不兼容:

Person name = new Person();
Run Code Online (Sandbox Code Playgroud)

它不会编译;您将收到一条错误消息。您必须这样做:

Person* name_ptr = new Person();
Run Code Online (Sandbox Code Playgroud)

然后,您必须Person使用不同的语法访问的所有成员:

name_ptr->getValue();
name_ptr->callFunction();
Run Code Online (Sandbox Code Playgroud)

最后,请记住,在这种情况下,必须显式销毁对象:

delete name_ptr;
Run Code Online (Sandbox Code Playgroud)

如果您忘记了这一点,可能会发生不好的事情。更确切地说,您的程序运行时间越长,其使用的内存可能会越来越多。

我认为指针对于您对C ++的理解水平还太高。远离它们,直到您真正需要它们为止。

  • 是的,绝对没有区别。请查看isocpp.org上的以下常见问题解答:http://isocpp.org/wiki/faq/classes-and-objects#overview-object (2认同)