如何将局部变量存储在堆中?
假设我有一类具有本地变量,像这样的:如何将局部变量存储在堆中?
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”在堆上。但是它的成员呢?他们不使用新的。是否有某种自动转换,以便这些局部变量是动态的?
一个类没有局部变量,它有成员变量。
而对象的大小包括成员变量。如果您打印sizeof(Object)
,您将在添加或删除成员变量时发现它会发生变化。
所以new
调用将会为完整的对象包括其成员变量(如报告sizeof(Object)
)分配空间,以及这些变量的*建设将发生的Object
建设呼叫的一部分。
一旦你调用了正确的C++名称,问题就变得很容易理解。
假设我有一类具有本地变量,像这样的:
类没有当地变量;只有函数和构造函数才行。你的班级有会员变量。
我的班级笔记说这是可能的和正确的:你可以动态地创建一个具有局部变量的对象。但是编译器究竟能够在堆中创建对象呢?
与放置在自动存储器中的局部变量(通常称为“堆栈”)成员变量不同,该对象位于哪里。如果对象位于自动存储器中,则其成员变量也位于自动存储器中。如果对象处于动态存储区域(通常称为“堆”),则其成员变量也位于堆中。
非常感谢,很抱歉如此愚蠢。 – user3448229
这是基本的面向对象的概念。使用成员声明一个类不会分配任何内存,除非您创建该类的对象(也称为实例化该类)。这是一个例外,当你说你说的“number1”是静态的。在这种情况下,它将属于该类,每个对象将获得相同的“number1”的内存保存值。在这种情况下,它将被称为“类变量”而不是“成员变量”。希望这可以帮助!
谢谢。一切都很有意义。 – user3448229