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

Posted

技术标签:

【中文标题】对象和实例之间的区别:C++【英文标题】:Difference between Object and instance : C++ 【发布时间】:2014-04-08 00:00:32 【问题描述】:

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

Person name;

name 是类person 的对象。

实例化时变成实例:

name=new Person();

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

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

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

【问题讨论】:

请参阅***.com/questions/10157122/…,了解如何在堆栈或堆上创建对象。 在 C++ 中,对象是一个存储区域。 术语对象和实例是可交换的。 new 创建没有自动存储持续时间的堆分配对象。 operator new() 的返回类型是一个指针。 【参考方案1】:

很简单但很重要

举个一般的例子:对象的一般含义是什么?它只不过是占用了一些空间而已....请记住,我们现在讨论 Java 或 C++ 中的对象

示例:这里我正在创建 Object   Student std=new Student();

其中 StudentClassstdObject 因为我们使用new 关键字的帮助,这意味着它在内部占用了内存中的一些空间,我们将 std 称为 Object

如果您不会为某个对象创建内存,那么我们将该 object 称为 instance

示例:学生标准;

这里 Student 是一个类,std 是一个实例(意味着只是该类的副本),除非我们创建一个,否则我们不会做任何事情记忆。

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

【讨论】:

【参考方案2】:

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

有一个通用的编程设计模式classinstanceclass 保存了 class 中所有 instances 的信息。

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

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

当您创建classstruct 的实例时,它可以通过堆栈上的自动命名变量(如Foo f;)、匿名自动命名变量(如some_function( Foo(17,22) ))、实例在免费商店(如new Foo(17, 22)),或通过placement-new(这是std::vectorstd::make_shared 创建实例的方式)。

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

如果您查看C++1y proposal for concepts lite,您会发现对象和实例在 C++ 中的含义可能不同。

int x = 0;
int& foo = x;
int* bar = &x;

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

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

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

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

现在,某些类型具有“引用语义”,因为它们在许多方面表现得像引用,但实际上是classes。这种类型的实例是否更好地称为引用或对象?在可怕的情况下,某些实例同时具有引用和对象语义:这通常是一个不好的迹象。

通过 3.9 [Types] 中的latest standard,我们拥有 C++ 中的类型。他们描述了对象类型是什么:

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

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

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

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

另一方面,我们确实讨论了classtemplates 和函数templates 的实例化。 14.7 是“模板实例化和特化”,实例化点(template)都是标准中的正式术语。

【讨论】:

我在 C++11 草案中进行了搜索。 “实例”这个词只出现了几次(主要是在“例如”:))。我认为您的观点很有趣,我可能会使用相同的术语,但是您能否指出标准中实际谈到“引用类型的实例”的地方? @ChristianHackl 不,该标准似乎没有笼统地谈论非对象类型的实例。它指的是对象和引用,但我找不到标准中使用的“类型实例”的通用术语......【参考方案3】:

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

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

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

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

Person name;

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

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++ 理解水平来说太高级了。在您真正需要它们之前远离它们。

【讨论】:

那么对象和实例绝对没有区别? 对,绝对没有区别。查看来自 isocpp.org 的这个常见问题解答:isocpp.org/wiki/faq/classes-and-objects#overview-object【参考方案4】:

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

Foo f;

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

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

Person name;

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

Person* name = new Person();

在本例中,我们创建了一个 Person* 类型的对象 name(指向 Person 的指针)。我们还使用表达式new Person() 创建了另一个Person 类型的对象。这个表达式返回一个指针,我们用它来初始化name 对象。

【讨论】:

我所区分的,如果我们引用 Java 而不是 C++,那会正确吗? @joeyrohan 不,但“实例”更像是一个 Java 术语。在 Java 中,人们倾向于谈论“X 的实例”而不是“X 类型的对象”。【参考方案5】:

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

【讨论】:

此外,您应该总是说 instance of。所以某个对象是某个类的一个实例。 @DSquare:这值得商榷。你会发现很多 C++ 程序员都在谈论“对象”。 IIRC 这也是标准中的首选术语(如果我弄错了,请纠正我)。 @ChristianHackl 我并不是说你应该总是说“instance”,我是说如果你说“instance”,那么你所说的是“instance of [class ]”。我们知道一个类的实例是一个对象。所以“实例”等于“对象”。

以上是关于对象和实例之间的区别:C++的主要内容,如果未能解决你的问题,请参考以下文章

初始化类和实例化对象之间的区别?

Java面试_君哥讲解笔记_java面向对象_12 java和C++的区别面向对象怎么理解重载和重写的区别构造器是否可以被重写静态变量和实例变量的区别

Java中,构造方法和实例化对象之间的关系

命名空间,类,对象和实例之间有什么区别?

C++只能实例化1个对象的类

在 C++ 中实例化对象的不同方法