2017-06-04 35 views
-2

假设我有一类具有本地变量,像这样的:如何将局部变量存储在堆中?

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


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

} 

现在假设我用它在我的主要程序:

int main(){ 
Object obj1(); 
} 

我主要在本地创建我的对象。由于我没有使用“新”它不使用堆。所有对象的变量(和对象本身)都存储在堆栈中。

现在假设我在主用新的,就像这样:

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

现在,我只有在我的主要一个变量:一个指针,指向在堆到OBJ1。

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

回答

1

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

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

所以new调用将会为完整的对象包括其成员变量(如报告sizeof(Object))分配空间,以及这些变量的*建设将发生的Object建设呼叫的一部分。

+0

谢谢。一切都很有意义。 – user3448229

2

一旦你调用了正确的C++名称,问题就变得很容易理解。

假设我有一类具有本地变量,像这样的:

类没有当地变量;只有函数和构造函数才行。你的班级有会员变量。

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

与放置在自动存储器中的局部变量(通常称为“堆栈”)成员变量不同,该对象位于哪里。如果对象位于自动存储器中,则其成员变量也位于自动存储器中。如果对象处于动态存储区域(通常称为“堆”),则其成员变量也位于堆中。

+0

非常感谢,很抱歉如此愚蠢。 – user3448229

0

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

相关问题