我关注了很多关于SO的帖子,最后我可以得出一个结论,当我们有类似这样的内容时:
Person name;
name
是类的对象person
。
实例化它成为实例:
name=new Person();
我是C ++的初学者,到目前为止,我已经看到我们可以访问以下函数和变量:
Person name;
name.getValue;
name.callFunction();
我们不需要为此使用new
运算符。那么我们可以说在C ++中可以忽略对象和实例之间的区别因素吗?
在C ++中,“对象”和“实例”几乎可以互换使用。
有一个通用的编程设计模式class
和instance
。在class
保存有关的所有信息instance
中,且s class
。
在C ++中,当您声明aclass
或时struct
,编译器将编写代码来描述您如何创建instance
of,class
数据布局是什么,并提供一些可用于与之交互的方法instance
(包括销毁)。
virtual
方法和继承似乎将某些方法和布局移至实例:但是数量非常有限。而是,每个实例都拥有指向virtual
类数据的指针。在某些语言中,您可以执行一些操作,例如在运行时替换实例的单个方法:但在C ++中则不能。
当您创建class
或的实例时,struct
可以通过堆栈上的自动命名变量(如Foo f;
),匿名自动命名变量(如some_function( Foo(17,22) )
),免费商店中的实例(如new Foo(17, 22)
)或通过placement- new
(即如何std::vector
与std::make_shared
创建实例)。
令人困惑的是,有一个单独的并行class
-instance
图案在C ++ - - 。class template
class
的class template
是class
,该实例是实例。该template
参数和专业化指示如何,在编译时,可以在“结构”的class
ES。上的模式匹配class template
提供了与实例无关的有限数量的属性(模式中的“类属性”)。(可以说函数template-function是该模式的另一个实例)。
如果您对精简概念的C ++ 1y提案有所了解,您将看到对象和实例在C ++中可能意味着不同的含义。
int x = 0;
int& foo = x;
int* bar = &x;
x
是类型的对象和实例int
。
foo
是type的实例int&
,但是调用foo
对象可能是错误的!它是一个引用-别名,或某个对象的其他名称(在本例中为x
)。
bar
是指向的指针int
,该指针是type的实例int*
,并且将其称为对象可能是正确的。
这是一个有用的区别:如果类型是引用类型,则它不必表示对象类型。对象类型在许多重要方面的行为与引用类型不同。
现在,某些类型具有“引用语义”,因为它们在许多方面的行为都类似于引用,但实际上是class
es。这种类型的实例是否更好地称为引用或对象?在可怕的情况下,某些实例同时具有引用和对象语义的混合:这通常是一个不好的信号。
通过3.9 [Types]中的最新标准,我们有了C ++中的各种类型。它们描述了什么是对象类型:
类型描述对象(1.8),引用(8.3.2)或函数(8.3.5)
和
对象类型是(可能是cv限定的)类型,不是函数类型,引用类型和void类型。
因此,将函数类型或引用类型的事物的“实例”称为“对象”似乎是不正确的。请注意,访问函数或引用实例的“表示形式”基本上是不可能的:将别名引用到它们所引用的对象中,并且使用函数名称会在帽子放下时衰减为指向函数的指针(并且函数指针基本上是不透明的句柄,可让您调用它们)。
因此可以说函数不是实例,引用不是实例。
第三,我们确实讨论了class
template
s和函数template
s的实例化。14.7是“模板实例化和专门化”,实例化点(的template
全部)均为标准的正式术语。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句