具有局部变量的对象如何存储在堆中?

时间:2017-06-04 16:33:44

标签: c++ object dynamic heap local

假设我有一个具有局部变量的类,如下所示:

class Object{
 private:
 int number1, number2, number3;


 public:
 Object(){
 number1=0;
 number2=0;
 number3=0;
 }

}

现在我假设我在主程序中使用它:

int main (){
Object obj1();
}

我在main中本地创建了我的对象。由于我没有使用“new”,因此它不使用堆。所有对象的变量(以及对象本身)都存储在堆栈中。

现在假设我在main中使用了new,就像这样:

int main (){
Object p= new obj1();
}

现在我的main中只有一个变量:一个指向堆中obj1的指针。

我的课堂笔记说这是可能的和正确的:你可以动态创建一个具有局部变量的对象。但编译器究竟能够在堆中创建对象?我的对象的变量number1,number2和number3不使用new。它们是局部变量,局部变量需要局部范围。我知道对象“p”在堆上,因为我们使用了“new”。但它的成员呢?他们不使用新的。是否存在某种自动转换以使这些局部变量成为动态的?

3 个答案:

答案 0 :(得分:2)

一旦你称之为正确的C ++名称,问题就变得非常容易理解了。

  

假设我有一个具有局部变量的类,如下所示:

类没有 local 变量;只有函数和构造函数才能。您的班级有成员变量。

  

我的课堂笔记说这是可能的和正确的:你可以动态创建一个具有局部变量的对象。但编译器究竟能够在堆中创建对象吗?

与置于自动存储(通常昵称为“堆栈”)的局部变量不同,成员变量会转到对象所在的任何位置。如果对象在自动存储中,则其成员变量也在自动存储中。如果对象位于动态存储区域(通常昵称为“堆”),那么其成员变量也在堆中。

答案 1 :(得分:1)

一个类没有局部变量,它有成员变量。

对象的大小包括成员变量。如果您打印sizeof(Object),您会在添加或删除成员变量时看到它发生变化。

因此new调用将为整个对象分配空间,包括其成员变量(由sizeof(Object)报告),并且这些变量的*构造将作为{{1}的一部分发生建设电话。

答案 2 :(得分:0)

这是面向对象的基本概念。除非您创建该类的对象(也称为实例化类),否则使用成员声明类不会分配任何内存。例外情况是当你宣布你的说法" number1"静止的。在这种情况下,它将属于该类,并且每个对象将获得相同的内存保持值" number1"。在这种情况下,它将被称为"类变量"而不是"成员变量"。希望这有帮助!