我跟踪了SO的一些帖子,最后我可以得出结论,当我们 有类似的东西:
Person name;
name
是类person
的对象。
实例化它时成为实例:
name=new Person();
我是C ++的初学者,到目前为止我已经看到我们可以访问函数和变量,如:
Person name;
name.getValue;
name.callFunction();
我们不需要使用new
运算符。那么我们可以说在C ++中可以忽略对象和实例之间的区别因素吗?
答案 0 :(得分:8)
在C ++中,“对象”和“实例”几乎可以互换使用。
class
和instance
有一般编程设计模式。 class
包含instance
中所有class
的信息。
在C ++中声明class
或struct
时,编译器会生成描述如何创建instance
class
的代码,数据布局是什么,并提供了一些可用于与instance
进行交互的方法(包括销毁)。
virtual
方法和继承似乎将一些方法和布局移动到实例:但数量非常有限。相反,每个实例都保存指向virtual
类数据的指针。在某些语言中,您可以执行诸如在运行时替换实例的单个方法的操作:但不能在C ++中替换。
当您创建class
或struct
的实例时,它可以通过堆栈上的自动命名变量(如Foo f;
),一个匿名的自动命名变量(如{ {1}}),免费商店中的实例(例如some_function( Foo(17,22) )
),或通过展示位置 - new Foo(17, 22)
(new
和std::vector
创建实例的方式)。< / p>
令人困惑的是,C ++中有一个单独的并行std::make_shared
- class
模式 - instance
- class template
。 class
是class template
,实例化是实例。 class
参数和特化指示在编译时如何“构造”template
es。 class
上的模式匹配提供了与实例无关的有限数量的属性(模式中的“类属性”)。 (可以说函数模板函数是模式的另一个实例)。
如果你看一下C++1y proposal for concepts lite,你会看到对象和实例在C ++中可能意味着不同的东西。
class template
int x = 0;
int& foo = x;
int* bar = &x;
既是对象又是x
类型的实例。
int
是foo
类型的实例,但调用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 ++中,您还可以调用基本类型的实例,如int
或double
“对象”。 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
。您可以说对象f
是Foo
的实例。
您尝试区分这些术语是不正确的。您实际指出的两件事是创建对象的两种不同方式。
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;
这里学生是一个类,而标准是一个实例(意味着只是该类的副本),除此之外我们不会做任何事情,除非我们创建一个记忆。
关于对象和实例的全部内容:)