Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Способы создания объекта класса 
:(
    Опции темы
Idsa
Дата 16.5.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: нет
Всего: 62



Здравсвуйте! Хотелось бы просветиться по следующему вопросу. В C++ можно объявить объект класса вот так: MyClass a; и через указатель: MyClass* b. Насколько я понимаю, внешнее отличие в этих двух способах в том, что переменной а мы не можем передать другой объект типа MyClass, а переменной b - можем. Однако хочется понять, как дело обстоит на более низком уровне? Переменная а будем размещена в стэке или в куче?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Fazil6
Дата 16.5.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Idsa @  16.5.2007,  19:36 Найти цитируемый пост)
Насколько я понимаю, внешнее отличие в этих двух способах в том, что переменной а мы не можем передать другой объект типа MyClass, а переменной b - можем.

что куда передать? 
Отличие в том, что первое - это объект, а второе - указатель.
Цитата(Idsa @  16.5.2007,  19:36 Найти цитируемый пост)
Переменная а будем размещена в стэке или в куче?

не в куче
PM MAIL   Вверх
zkv
Дата 16.5.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Idsa, MyClass* b - указатель на объект, сам объект в этом случае нигде сам не появится, если только мы память под него не выделим: b = new MyClass(/*params if need*/);
Цитата(Idsa @  16.5.2007,  19:36 Найти цитируемый пост)
Насколько я понимаю, внешнее отличие в этих двух способах в том, что переменной а мы не можем передать другой объект типа MyClass, а переменной b - можем

неправильно понимаете.
 
Если рассматривать такую ситуацию:
Код

MyClass* b  = new MyClass;
MyClass a;

то переменная a представляет из себя объект класса (причем он лежит в стеке), а переменная b - это адрес объекта в куче.

или такой случай:
Код

MyClass a;
MyClass* b  = &a;

a - объект класса, а b - указатель на него, те все действия над объектом лежащим по адресу, хранящемуся в b будут отражены на объекте a, так как это он и есть  smile 

А вы из дотнета пожаловали? smile 
В таком случае напомню, что память выделенную под объекты (MyClass* b  = new MyClass;) надо еще и освобождать delete b; (delete []b; - для массивов). 
Стековых переменных это не касается smile

Это сообщение отредактировал(а) zkv - 16.5.2007, 20:00
PM MAIL   Вверх
Idsa
Дата 16.5.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: нет
Всего: 62



Цитата(Fazil6 @  16.5.2007,  19:46 Найти цитируемый пост)
не в куче

Понт smile

Цитата(zkv @  16.5.2007,  19:49 Найти цитируемый пост)
Если рассматривать такую ситуацию:

Да, именно такую ситуацию я имел в виду.

Цитата(zkv @  16.5.2007,  19:49 Найти цитируемый пост)
А вы из дотнета пожаловали?

Ага. Просто после C# дико смотрится то, что классы могут храниться в стеке smile.

zkv, +1.

Ну и еще в тему топика. Чем обусловлено то, что на этапе компиляции мы можем задать массив, хранящийся в стеке: int a[3], а в рантайме можем заюзать для массива только кучу: int* a[] = new int[n]?

Это сообщение отредактировал(а) Idsa - 16.5.2007, 20:22


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Partizan
Дата 16.5.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Idsa, а потому что, насколько я понимаю, чтобы посчитать смещение в стеке, нужно знать размер массива...

поправьте, если ошибаюсь...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Idsa
Дата 16.5.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: нет
Всего: 62



Partizan, конечно так smile. Но ведь к моменту выделения памяти через new мы уже знаем размер массива.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Partizan
Дата 16.5.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Idsa, в том то и прикол что момент выделения памяти происходит в рантайме и на этапе сборки смещения посчитать ну никак компилятор несможет )


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Fazil6
Дата 16.5.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Idsa @  16.5.2007,  20:07 Найти цитируемый пост)
Понт

"не в куче" не означает в стеке. В стеке размещаются автоматические переменные.
Глобальная 
Код

MyClass a;
 неавтоматическая и  размещается в сегменте данных. Так что именно "не в куче"...
Цитата(Idsa @  16.5.2007,  20:07 Найти цитируемый пост)
Чем обусловлено то, что на этапе компиляции мы можем задать массив, хранящийся в стеке: int a[3], а в рантайме можем заюзать для массива только кучу: int* a[] = new int[3]?

Что значит в рантайме?
new [] используется когда размер при компилляции неизвестен. Конструкция int* a[] = new int[3] в любом случае может быть заменена на int a[3]

PM MAIL   Вверх
Idsa
  Дата 16.5.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: нет
Всего: 62



Цитата(Fazil6 @  16.5.2007,  20:27 Найти цитируемый пост)
new [] используется когда размер при компилляции неизвестен. Конструкция int* a[] = new int[3] в любом случае может быть заменена на int a[3]

Я очепятался и уже исправил. Вопрос звучал именно так:
Цитата(Idsa @  16.5.2007,  20:07 Найти цитируемый пост)
Чем обусловлено то, что на этапе компиляции мы можем задать массив, хранящийся в стеке: int a[3], а в рантайме можем заюзать для массива только кучу: int* a[] = new int[n]?


Добавлено через 2 минуты и 58 секунд
Цитата(zkv @  16.5.2007,  19:49 Найти цитируемый пост)
В таком случае напомню, что память выделенную под объекты (MyClass* b  = new MyClass;) надо еще и освобождать delete b; (delete []b; - для массивов). Стековых переменных это не касается 

Переменная типа MyClass myVar будет удалена из стека сразу после выхода из ее области видимости?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Fazil6
Дата 16.5.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Idsa @  16.5.2007,  20:30 Найти цитируемый пост)
Переменная типа MyClass myVar будет удалена из стека сразу после выхода из ее области видимости?

да
PM MAIL   Вверх
Idsa
Дата 16.5.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: нет
Всего: 62



Цитата(Fazil6 @  16.5.2007,  20:47 Найти цитируемый пост)
да

Понятно. Пасиб. +1.

Ну а что все-таки насчет вот этого вопроса:
Цитата(Idsa @  16.5.2007,  20:30 Найти цитируемый пост)
Чем обусловлено то, что на этапе компиляции мы можем задать массив, хранящийся в стеке: int a[3], а в рантайме можем заюзать для массива только кучу: int* a[] = new int[n]?


Цитата(Fazil6 @  16.5.2007,  20:27 Найти цитируемый пост)
Конструкция int* a[] = new int[3] в любом случае может быть заменена на int a[3]

Но при этом в первом случае память выделится в куча, а во втором - в стеке? 


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Anikmar
Дата 16.5.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Fazil6 @  16.5.2007,  20:27 Найти цитируемый пост)
Конструкция int* a[] = new int[3] в любом случае может быть заменена на int a[3]

В смысле, я так понял, имелась в виду конструкция
int *a = new int[3];

Что-то я не понял. Это по какому праву компилятор сделает массив в стеке? Это же может привести к AV причем совершенно на ровном месте.

А вообще-то конструкция
int a[3] не обязательно создается в стеке.
Например, определенная вне функций и  методов она создастся в куче. А еще есть слово static...

Это сообщение отредактировал(а) Anikmar - 16.5.2007, 21:11
PM MAIL ICQ   Вверх
vinter
Дата 16.5.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(Idsa @  16.5.2007,  20:58 Найти цитируемый пост)
Но при этом в первом случае память выделится в куча

верно всегда
Цитата(Idsa @  16.5.2007,  20:58 Найти цитируемый пост)
 а во втором - в стеке? 

а это зависит от обстоятельств(где создано)


--------------------
Мой блог
PM MAIL WWW   Вверх
Idsa
Дата 16.5.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: нет
Всего: 62



Цитата(Anikmar @  16.5.2007,  21:07 Найти цитируемый пост)
В смысле, я так понял, имелась в виду конструкцияint *a = new int[3];

Да smile

Цитата(Anikmar @  16.5.2007,  21:07 Найти цитируемый пост)
Что-то я не понял. Это по какому праву компилятор сделает массив в стеке? Это же может привести к AV причем совершенно на ровном месте.

Что за AV? По контексту я подумал про Stack Overflow... но не подходит smile

Цитата(Anikmar @  16.5.2007,  21:07 Найти цитируемый пост)
А вообще-то конструкцияint a[3] не обязательно создается в стеке.

Если массив статический или глобальный, то он будет создан в сегменте данных. Но если массив ни статический, ни глобальный, то он точно будет создан в стеке. Ведь так?

P. S. Прошу обратить внимание на мою подпись!

Это сообщение отредактировал(а) Idsa - 16.5.2007, 22:22


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Hurricane
Дата 16.5.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Цитата(vinter @ 16.5.2007,  13:41)
Цитата(Idsa @  16.5.2007,  20:58 Найти цитируемый пост)
Но при этом в первом случае память выделится в куча

верно всегда
Цитата(Idsa @  16.5.2007,  20:58 Найти цитируемый пост)
 а во втором - в стеке? 

а это зависит от обстоятельств(где создано)

Ну, в принципе, и в первом случае можно память в стеке выделить - если перегрузить оператор new.

Добавлено через 1 минуту и 37 секунд
Цитата(Idsa @  16.5.2007,  14:20 Найти цитируемый пост)
Что за AV? По контексту я подумал про Stack Overflow... но не подходит 

Это он так Memory [A]ccess [V]iolation обозвал.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.