什么可以实例化?

时间:2009-11-16 23:15:03

标签: c++ oop

可以实例化C ++中的哪些类型?

我知道以下各项直接创建Foo的单个实例:

Foo bar;
Foo *bizz = new Foo();

然而,内置类型怎么样?以下是否创建了int的两个实例,或者实例是要使用的错误单词并且正在分配内存?

int bar2;
int *bizz2 = new int;

指针怎么样?上面的示例是否创建了int *实例,或者仅为int *

分配内存

使用423.14这样的文字会创建一个实例吗?

我已经看到了这样的论点:如果你不能对一个类进行子类化,那么它不是一个类,如果它不是一个类,它就不能被实例化。这是真的吗?

5 个答案:

答案 0 :(得分:4)

只要我们谈论C ++,唯一的权威来源就是ISO标准。除了类和函数模板之外,它不会使用“实例化”这个词。

然而,它确实使用了“实例”这个词。例如:

  

具有自动存储持续时间(3.7.2)的每个对象的实例与其块中的每个条目相关联。

请注意,在C ++的说法中,int左值也是一个“对象”:

  

C ++程序中的构造创建,销毁,引用,访问和操作对象。对象是存储区域。

由于new清楚地创建了存储区域,因此创建的任何东西都是一个对象,并且遵循规范的先例,可以称为实例。

答案 1 :(得分:3)

据我所知,你真的只是问这里的术语。 C ++标准唯一真正的区别是POD类型和非POD类型,其中非POD类型具有用户定义的构造函数,成员函数,私有变量等功能,而POD类型则没有。像intfloat这样的基本类型当然是POD,POD的数组和POD的C结构也是如此。

除了(和重叠)C ++之外,面向对象编程中“实例”的概念通常是指为内存中的对象分配空间,然后使用构造函数初始化它。无论是在堆栈上还是在堆上执行此操作,还是在内存中的任何其他位置,这都是无关紧要的。

但是,C ++标准似乎将所有数据类型都视为“对象”。例如,在3.9中它说:

  

“T类型的对象表示   是N unsigned char的序列   对象占用的对象   T,其中N等于sizeof(T)......“

基本上,C ++标准本身唯一的区别是POD与非POD。

答案 2 :(得分:2)

在C ++中,'instance'和'instantiate'仅与Classes

相关联 然而,请注意,这些也是具有会话意义的英语单词。 '指针'肯定是英语用法中的一类东西,指针肯定是该类的一个实例

但在c ++中说'指针'不是类,指针不是类的实例

另见 - 针头上有多少天使

答案 3 :(得分:2)

“实例”的概念不是C ++真正固有的东西 - 基本上你有“具有构造函数的东西和不具有的东西”。

因此,所有类型都有一个大小,例如int通常是4个字节,带有几个int的结构将是8,依此类推。现在,在该结构上打一个构造函数,它就像一个类一样开始查找(和行为)。更具体地说:

int foo; // <-- 4 bytes, no constructor

struct Foo
{
  int foo;
  int bar;
}; // <-- 8 bytes, no constructor

struct Foo
{
  Foo() : foo(0), bar(0) {}
  int foo;
  int bar;
}; // <-- 8 bytes, with constructor

现在,您可以将任何这些类型都存储在堆栈上。当您在堆栈上创建内容时,就像“int foo;”如上所述,在其范围消失后消失(例如在函数调用结束时)。如果您使用“new”创建某些内容,它会在上运行并获得自己的位置,直到您在其上调用 delete 。在这两种情况下,构造函数(如果存在)将在实例化期间被调用。

答案 4 :(得分:1)

执行“new int”是不寻常的,但它是允许的。您甚至可以将0或1个参数传递给构造函数。我不确定“new int()”是否意味着它是0初始化(我猜是的)与“new int”不同。

当你在堆栈上定义一个值时,它通常不被称为“分配内存”(虽然它理论上它在堆栈中获得内存,但该值可能只存在于CPU寄存器中)。

文字不一定在程序存储器中获得地址; CPU指令可以直接编码数据(例如,将42放入寄存器B)。可能任意浮点常量都有一个地址。