class T{
public:
T(){}
};
int main ()
{
T *t = new T; //line 8
}
我的意思是代码在进入构造函数之前是什么样子的?例如,在第 8 行 operator new 返回地址,然后代码看起来像T *t = T 0x0FF00
,因为它像对象定义,不能像0x0FF00 T
。因此,如果它是真的,这个由 operator new 返回的地址如何位于类型 T 之后,尽管 operator new 之前返回它?
class T{
public:
T(){}
};
int main ()
{
T *t = new T; //line 8
}
我的意思是代码在进入构造函数之前是什么样子的?例如,在第 8 行 operator new 返回地址,然后代码看起来像T *t = T 0x0FF00
,因为它像对象定义,不能像0x0FF00 T
。因此,如果它是真的,这个由 operator new 返回的地址如何位于类型 T 之后,尽管 operator new 之前返回它?
T *t = new T;
// ^^^^^
这是一个t
类型的声明T*
。它由 . 之后的表达式初始化=
。整个new T
部分是此初始化程序中的新表达式。
new 表达式导致为类型对象分配内存,然后T
在该空间中构造该对象。new 表达式返回一个指向该对象的指针。也就是说,在对new-expression求值后,该行现在看起来像:
T *t = returned_pointer;
我假设您正在使用0x0FF00
作为示例内存地址 - 在这种情况下,您可以想象该行已变为:
T *t = 0x0FF00; // Note: this wouldn't actually compile because 0x0FF00 is an integer literal
t
现在使用该内存地址初始化指针。
您可能会对new-expression 的作用感到困惑。它有以下两个步骤:
它调用适当的分配函数(通常是operator new
),传递存储类型对象所需的内存大小T
。operator new
分配该内存并返回指向该位置的地址。
T
然后它在该空间中初始化一个类型的对象。