可以实例化C ++中的哪些类型?
我知道以下各项直接创建Foo
的单个实例:
Foo bar;
Foo *bizz = new Foo();
然而,内置类型怎么样?以下是否创建了int
的两个实例,或者实例是要使用的错误单词并且正在分配内存?
int bar2;
int *bizz2 = new int;
指针怎么样?上面的示例是否创建了int *
实例,或者仅为int *
?
使用42
或3.14
这样的文字会创建一个实例吗?
我已经看到了这样的论点:如果你不能对一个类进行子类化,那么它不是一个类,如果它不是一个类,它就不能被实例化。这是真的吗?
答案 0 :(得分:4)
只要我们谈论C ++,唯一的权威来源就是ISO标准。除了类和函数模板之外,它不会使用“实例化”这个词。
然而,它确实使用了“实例”这个词。例如:具有自动存储持续时间(3.7.2)的每个对象的实例与其块中的每个条目相关联。
请注意,在C ++的说法中,int
左值也是一个“对象”:
C ++程序中的构造创建,销毁,引用,访问和操作对象。对象是存储区域。
由于new
清楚地创建了存储区域,因此创建的任何东西都是一个对象,并且遵循规范的先例,可以称为实例。
答案 1 :(得分:3)
据我所知,你真的只是问这里的术语。 C ++标准唯一真正的区别是POD类型和非POD类型,其中非POD类型具有用户定义的构造函数,成员函数,私有变量等功能,而POD类型则没有。像int
和float
这样的基本类型当然是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)。可能任意浮点常量都有一个地址。