Что произойдет, если класс создает все локальные переменные в стеке (т. int i;//An integer
в стеке против int *p;//Pointer to an int
), а сам экземпляр int *p;//Pointer to an int
в куче? Где члены класса? Вот пример:
class A {
public:
int a, b; //These are instantiated on the stack, if the line were written outside a class definition.
A(int _a, int _b) {
a = _a;
b = _b;
}
};
Теперь, если мы создадим A следующим образом:
#include <iostream>
A* classA = new A(1,2);
int main(void) {
std::cout << classA.a << "\t" << classA.b << endl;
return 0;
}
Где classA.a
и classA.b
? Являются ли они в стеке программ? Являются ли они автоматически помещены в кучу, а classA
?
Не проблема в большинстве случаев, я бы не подумал, но было бы полезно узнать...
int a, b;//These are instantiated on the stack,
Нет, они не создаются в стеке. Переменные-члены являются частями структуры данных экземпляра и поэтому распределяются в одном куске памяти как экземпляр класса. Только если экземпляр класса находится в стеке, тогда также имеются поля экземпляра.
Эта строка фактически неверна
int a, b; //These are instantiated on the stack, normally
Это зависит от того, как создается объект - с использованием new
или в стеке
int a, b;
был написан вне класса, тогда они будут созданы в программном стеке. Я уточню это в редактировании.
Класс - это определение структуры данных; блок памяти. Он не определяет, откуда этот блок памяти. Однако вся память для одного объекта происходит из одного и того же места.
static Class A ;
Выделяет все данные для A в разделе программы стека.
. . . . .
{
Class A ;
}
Выделяет ВСЕ данные для A в стеке (или любой используемый механизм --- стек).
Class *A = new A ;
Выделяет все данные для A в динамической памяти.
a
иb
не являются локальными переменными, они являются членами класса.