class T{
public:
T(){}
};
int main ()
{
T *t = new T; //line 8
}
我的意思是在输入构造函数之前代码是怎样的?例如,在第8行中,运算符new返回地址,然后代码看起来像T *t = T 0x0FF00
,因为它类似于对象定义,不能像0x0FF00 T
。因此,如果它是真的,那么运算符new返回的地址如何位于T类之后,那么运算符new之前是否会返回它?
答案 0 :(得分:3)
T *t = new T;
// ^^^^^
这是t
类T*
的声明。它由=
之后的表达式初始化。整个new T
部分是此初始值设定项中的 new-expression 。
new-expression 导致为类型为T
的对象分配内存,然后在该空间中构造该对象。 new-expression 返回指向该对象的指针。也就是说,在评估 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
类型的对象。