假设例如struct
:
struct Point{
int x;
int y;
};
我声明了一个指向这个结构的指针:
Point* p;
x 和 y 在p
哪里,堆还是堆栈?
和课程一样吗?
where's
x
andy
of thatp
,堆还是栈?
无处。你还没有创建一个对象,只是一个可以指向一个的指针。
如果您在堆栈上创建一个自动对象,那么它将是:
Point point;
Point * p = &point;
如果你在堆上创建一个动态对象(官方称为free store),那么它就是:
Point * p = new Point; // Don't forget to delete it.
上课也一样吗?
是的; astruct
是一个类。
问题的答案取决于p
指向什么。如果它指向一个堆栈分配的结构,那么p->x
和p->y
都在堆栈上。如果它是用new
(或malloc
)获得的,那么它们就在堆上。
与其他一些语言不同,C++ 类和结构的布局没有区别。它们之间的区别仅在于默认访问限制:默认情况下class
成员是私有的,而struct
成员是公共的。
这取决于您如何初始化p
. 变量x
和指向:如果在堆上,它们在堆上y
;p
如果它在堆栈上,它们就在堆栈上,如果p
指向静态变量,它们都不是。
忘记堆和堆栈:这些是编译器的实现细节。您感兴趣的不是这些位的位置,而是它们可能拥有的寿命。
而且 C++ 并没有真正的结构:无论使用什么关键字(struct
或class
)union
,声明的都是类类型。(类类型可以分为两大类,联合和非联合类类型。)