假设我有一个具有局部变量的类,如下所示:
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”。但它的成员呢?他们不使用新的。是否存在某种自动转换以使这些局部变量成为动态的?
答案 0 :(得分:2)
一旦你称之为正确的C ++名称,问题就变得非常容易理解了。
假设我有一个具有局部变量的类,如下所示:
类没有 local 变量;只有函数和构造函数才能。您的班级有成员变量。
我的课堂笔记说这是可能的和正确的:你可以动态创建一个具有局部变量的对象。但编译器究竟能够在堆中创建对象吗?
与置于自动存储(通常昵称为“堆栈”)的局部变量不同,成员变量会转到对象所在的任何位置。如果对象在自动存储中,则其成员变量也在自动存储中。如果对象位于动态存储区域(通常昵称为“堆”),那么其成员变量也在堆中。
答案 1 :(得分:1)
一个类没有局部变量,它有成员变量。
对象的大小包括成员变量。如果您打印sizeof(Object)
,您会在添加或删除成员变量时看到它发生变化。
因此new
调用将为整个对象分配空间,包括其成员变量(由sizeof(Object)
报告),并且这些变量的*构造将作为{{1}的一部分发生建设电话。
答案 2 :(得分:0)
这是面向对象的基本概念。除非您创建该类的对象(也称为实例化类),否则使用成员声明类不会分配任何内存。例外情况是当你宣布你的说法" number1"静止的。在这种情况下,它将属于该类,并且每个对象将获得相同的内存保持值" number1"。在这种情况下,它将被称为"类变量"而不是"成员变量"。希望这有帮助!