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

时间:2014-03-05 18:23:15

标签: c++ oop object instance

我跟踪了SO的一些帖子,最后我可以得出结论,当我们 有类似的东西:

Person name;

name是类person的对象。

实例化它时成为实例:

name=new Person();

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

Person name;
name.getValue;
name.callFunction();

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

5 个答案:

答案 0 :(得分:8)

在C ++中,“对象”和“实例”几乎可以互换使用。

classinstance有一般编程设计模式。 class包含instance中所有class的信息。

在C ++中声明classstruct时,编译器会生成描述如何创建instance class的代码,数据布局是什么,并提供了一些可用于与instance进行交互的方法(包括销毁)。

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

当您创建classstruct的实例时,它可以通过堆栈上的自动命名变量(如Foo f;),一个匿名的自动命名变量(如{ {1}}),免费商店中的实例(例如some_function( Foo(17,22) )),或通过展示位置 - new Foo(17, 22)newstd::vector创建实例的方式)。< / p>

令人困惑的是,C ++中有一个单独的并行std::make_shared - class模式 - instance - class templateclassclass template,实例化是实例。 class参数和特化指示在编译时如何“构造”template es。 class上的模式匹配提供了与实例无关的有限数量的属性(模式中的“类属性”)。 (可以说函数模板函数是模式的另一个实例)。

如果你看一下C++1y proposal for concepts lite,你会看到对象和实例在C ++中可能意味着不同的东西。

class template

int x = 0; int& foo = x; int* bar = &x; 既是对象又是x类型的实例。

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

x是指向bar的指针,它是int类型的实例,并且将其称为对象可能是正确的。

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

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

通过3.9 [类型]中的latest standard,我们在C ++中有各种类型。它们描述了对象类型的含义:

  

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

  

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

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

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

第三方面,我们讨论了class class和函数template的实例化。 14.7是“模板实例化和专业化”,实例化(template)的实例化都是标准的正式术语。

答案 1 :(得分:4)

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

答案 2 :(得分:4)

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

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

Person类型name是一个(命名不太好)的变量,用于访问该类型的对象

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

Person name;

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

new Person()要复杂得多。您可能熟悉Java等语言中的new关键字,但在C ++中,它是一个非常不同的野兽。这意味着创建了Person类型的新对象,但这也意味着您有责任在以后销毁它。它还为新创建的对象提供了一种不同类型的句柄:所谓的指针Person指针如下所示:

Person*

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

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

Person name = new Person();

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

Person* name_ptr = new Person();

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

name_ptr->getValue();
name_ptr->callFunction();

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

delete name_ptr;

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

我认为指针对于你的C ++理解水平来说还是太先进了。远离它们直到你真正需要它们。

答案 3 :(得分:2)

“对象”和“实例”几乎可以互换。在C ++中,对象正式是任何存储区域。 “实例”不是正式定义的术语,但我们通常引用“X类型的实例”,最常用于类类型。

Foo f;

此声明创建一个名为f的对象。对象的类型为Foo。您可以说对象fFoo的实例。

您尝试区分这些术语是不正确的。您实际指出的两件事是创建对象的两种不同方式。

Person name;

在这种情况下,我们正在创建name类型的对象Person

Person* name = new Person();

在这种情况下,我们正在创建类型为name的对象Person*(指向Person的指针)。我们还使用表达式Person创建了另一个new Person()类型的对象。该表达式返回一个指针,我们用{。

初始化name对象

答案 4 :(得分:2)

这很简单但很重要

举一个例子:对象的一般含义是什么?它只是占据了一些空间......请记住我们现在谈论java或C ++中的Object

示例:这里我创建了对象学生std = new Student();

其中学生标准对象,因为我们为std创建了一个内存 new keyWord的帮助意味着它在内部占据了内存中的一些空间,我们将标准称为对象

如果您不为对象创建内存,那么我们将对象称为实例

示例:Student std;

这里学生是一个类,而标准是一个实例(意味着只是该类的副本),除此之外我们不会做任何事情,除非我们创建一个记忆。

关于对象和实例的全部内容:)