2014-11-15 3 views
0

Что произойдет, если класс создает экземпляры всех локальных переменных в стеке (то есть: int i; //An integer в стеке по сравнению с 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; 
    } 
}; 

Теперь, если мы создаем так:

#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 есть?

Не проблема, в большинстве случаев, я не думаю, но это может быть полезно знать ...

+0

'a' и' b' не являются локальными переменными, они являются членами класса. –

+0

@JonathanPotter Хорошо, я заменил локальные переменные на классы. Какая разница, кроме соглашения об именах, между прочим? В моей книге на C++ локальные переменные и члены класса взаимозаменяемы ... – PyroAVR

ответ

4

int a, b; //These are instantiated on the stack,

Нет, это не экземпляр в стеке. Переменные-члены являются частями структуры данных экземпляра и поэтому распределяются в одном куске памяти как экземпляр класса. Только если экземпляр класса находится в стеке, тогда также имеются поля экземпляра.

1

Эта линия фактически неверно

int a, b; //These are instantiated on the stack, normally 

Это зависит от того, как создается объект - с помощью new или в стеке

+0

Я думаю, что ошибка в ясности. Я не понял, что я имел в виду. если 'int a, b;' был написан вне класса, то они будут созданы в стеке программ. Я уточню это в редактировании. – PyroAVR

0

Класс является определение структуры данных; блок памяти. Он не определяет, откуда этот блок памяти. Однако вся память для одного объекта происходит из одного и того же места.

static Class A ; 

Выделяет все данные для A в разделе программы стека.

. . . . . 
{ 
    Class A ; 
} 

Выделяет ВСЕ данные для А в стеке (или любой используемый механизм --- стек).

Class *A = new A ; 

Выделяет все данные для A в динамической памяти.