说我有一个班级
class foo
{
private:
std::string str;
int a;
poo* p;
public:
foo
{
p = new poo();
}
void someMethod() {....}
}
现在我想知道我是否采用以下方式:
foo* f = new foo();
或
foo f;
在每种情况下,会在哪里创建变量str
,a
和p
?成员变量是否受类创建方式的影响?例如,我认为将在堆栈上创建str
和a
,并在堆上创建p
。如果有人能清除它,我将不胜感激。
答案 0 :(得分:2)
指向的poo
实例p
始终位于堆上,但指针本身(p
)位于foo
实例中。
在第一个版本(foo* f = new foo()
)中,在堆上创建foo
实例(包括它的所有成员,它们总是在同一个地方)和指向它的指针({{ 1}} var)存储在堆栈或某些寄存器中(直到编译器)。
在第二个版本中,foo实例位于堆栈中(包括其所有成员)。
但请注意,对象的实际位置并不像对象的实际范围那么重要。你应该真正查找RAII这个词。
答案 1 :(得分:0)
创建类的非静态数据成员,在那里创建类的对象。