Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/43: Рейтинг темы: голосов - 43, средняя оценка - 4.53
mister2010
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 64
#1

Понятие принципа создания динамических объектов

04.06.2010, 01:27. Просмотров 7794. Ответов 15
Метки нет (Все метки)

Например я написал такой код:
Код
#include <iostream>
#include <string>

using namespace std;

class Box
{
     public:
           double width;
           int z;
           Box(char *u) { cout<<u<<endl; };
		   Box(int rediska) { cout<<rediska; };
           Box() {};
     };

int main()
{
     setlocale(0,"");

     Box *d1 = new Box("Привет клоун");
     Box *d2 = new Box(7);
     Box * lyk = new Box;
     Box(); 

     delete d1;
     delete d2;

     cin.get();
}
Для того чтоб создать объект статически, то есть память по которой будет хранится объект это стек - память выделяемая во время выполнения для моего екзе ОП памятью. То есть вот это
Код
Box induk; //Создание объекта который будет иметь имя индюк
Когда же я написал:
Код
Box * lyk = new Box;
Это означает что я объявил указатель под названием лук, который ссылается на область памяти по которой лежит что-то из класса, и этот указатель лук после того как сослался на область памяти по которой к примеру лежит переменная z из класса Box, указатель лук присваивает себе эту область памяти;

1)Где тут создается объект динамический, если это указатель на что-то из класса?
2)Почему, чтоб получить доступ динамически к классу нужно именно
писать имя указателя который содержит в себе область памяти по которой лежит что-то из класса?

Добавлено через 3 часа 40 минут
Что, никто не знает что ли?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2010, 01:27
Ответы с готовыми решениями:

Удаление динамических объектов
есть программа, в которой реализован список объектов, создающиеся динамически....

Динамический массив динамических объектов
Физически задача поставлена так: есть узел который состоит из разных деталей,...

Декларирование атрибутов динамических объектов
Здравствуйте. Пишу шахматную программу. Решил использовать динамические...

Контейнер и получение динамических объектов
Привет. Как можно грамотно с точки зрения ООП реализовать класс-контейнер, где...

STL вектор динамических объектов
Нужно время от времени ложить в std::vector (или std::list) динамические...

15
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
04.06.2010, 03:27 #2
C++
1
Box * lyk = new Box;
создаётся переменная lyk, она имеет тип указатель на объект типа Box
значит она может хранить адрес объекта типа Box
new Box - выделяет память для объекта типа Box, возвращает адрес этой памяти
адрес выделенной памяти записывается в переменную lyk

всё это можно записать так
C++
1
2
3
4
5
6
7
8
    Box *lyk;
 
    lyk = new Box;
 
    cout << lyk->z << endl;
 
    delete lyk; // из переменной lyk взяли адрес памяти и передали его оператору delete
                // он дальше сам занимается
Добавлено через 2 минуты
смысл в том, что в переменную lyk можно записывать новый адрес
записали, поюзали, освободили, выделили новый, записали, поюзали, освободили ...
также туда можно записывать адрес просто любого объекта типа Box, даже если он создан не через new
2
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
04.06.2010, 08:03 #3
Для того чтоб создать объект статически, то есть память по которой будет хранится объект это стек - память выделяемая во время выполнения для моего екзе ОП памятью.
стек используется совсем не для того, в нем ни чего не хранится (тем более объекты), он служит для временного хранения каких-либо значений, либо для передачи аргументов ф-циям, вобщем по всякому бывает, но он ни чего не хранит!
1
mister2010
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 64
04.06.2010, 20:30  [ТС] #4
1)Статичекая память выделяется оп. памябтью только на этапе компиляци только? Когда уже программа скомпилина, оперативная память работает с программой выделяя только ей стековую и динамическую память и больше никакую?

2)Box *d = new Box;
d это только переменная которая будет содержать адрес объекта, а почему объекта?

Если я напишу d->ser(); Где тут указание на объект?
Это указатель на функцию класса.
0
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
05.06.2010, 12:14 #5
Цитата Сообщение от mister2010 Посмотреть сообщение
1) оперативная память работает с программой выделяя только ей стековую и динамическую память и больше никакую?
в каждой программе есть определенный объем памяти, которая предназначена для стека и "кучи", ну и собственно сам код. Советую что-нибудь почитать на эту тему.

2)Box *d = new Box;
d это только переменная которая будет содержать адрес объекта, а почему объекта?
d - это переменная, которая содержит адрес указанного типа данных, в данном случае это тип Box, т.е. объект класса.

Если я напишу d->ser(); Где тут указание на объект?
Это указатель на функцию класса.
да, это тоже самое, что d.ser()
0
mister2010
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 64
05.06.2010, 16:03  [ТС] #6
Код
Box *d = new Box; 
d->f(); //Это вызов функции объекта класса через указатель.
Где здесь объект класса?
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
05.06.2010, 16:09 #7
Цитата Сообщение от mister2010 Посмотреть сообщение
Где здесь объект класса?
Объект не "здесь" или "там". Объект в памяти. В стеке или в куче - в зависимости от таго как объект создан.

К членам объекта можно обращатся напрямую:
C++
1
2
ClassName object;
object.FunctionName();
или косвенно, через указатель:
C++
1
2
ClassName* object = new ClassName;
object->FunctionName();
0
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
05.06.2010, 16:19 #8
Цитата Сообщение от mister2010 Посмотреть сообщение
Код
Box *d = new Box; 
d->f(); //Это вызов функции объекта класса через указатель.
Где здесь объект класса?
на него (объект) указывает d, поэтому к ф-ции обращение через оператор "стрелка"

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Объект в памяти. В стеке или в куче - в зависимости от таго как объект создан.
А что, объект может хранится в стеке??? Что-то я сомневаюсь.
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
05.06.2010, 16:26 #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
А что, объект может хранится в стеке??? Что-то я сомневаюсь.
Хорошо, что по твоему такое стек и по каким причинам в нем не может храниться объект?
И где он храниться, если не рамещен в куче оператором new?
0
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
05.06.2010, 16:46 #10
Ну я может не правильно выразился. Да, в стеке хранятся временные объекты, до выхода из области видимости. А все невременные в сегменте данных, хотя для Windows это условности (всмысле сегменты).

Добавлено через 6 минут
Хотя сейчас погуглил, блин странно все это... Похоже объекты хранятся в стеке. Просто я на С++ после ASM'а перешел и меня удивляет такое использование стека.

Добавлено через 7 минут
Да, объекты хранятся в стеке!
CyBOSSeR, а почему вы меня не поправили в 3ем посту (посте , хз))? Я до сих пор о стеке думал в формате ASM
0
mister2010
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 64
05.06.2010, 16:46  [ТС] #11
В чём различие стековой памяти от статической в программировании?
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
05.06.2010, 17:14 #12

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
CyBOSSeR, а почему вы меня не поправили в 3ем посту (посте , хз))?
Видать не заметил.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я до сих пор о стеке думал в формате ASM
Ну чтож, придеться перестраиваться на C++:).



Добавлено через 21 минуту
Цитата Сообщение от mister2010 Посмотреть сообщение
В чём различие стековой памяти от статической в программировании?
mister2010, не забивай себе голову.
Просто запомни, объект может располагаться либо в стеке, либо в куче.
1
mister2010
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 64
05.06.2010, 17:16  [ТС] #13
C
1
Просто запомни, объект может располагаться либо в стеке, либо в куче.
Статический объект или динамический?
А для чего тогда статическая память ,если стековая память и динамическая память предназначена для дин. объектов?
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
05.06.2010, 17:42 #14
Цитата Сообщение от mister2010 Посмотреть сообщение
Статический объект или динамический?
Хорошо, давай так. Перечисли свою "классификацию" (статический, динамический и т.д.) объектов и что ты под этим подразумаваешь.
0
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
06.06.2010, 08:57 #15
Цитата Сообщение от mister2010
Если я напишу d->ser(); Где тут указание на объект?
Это указатель на функцию класса.
d указатель на объект (хранит адрес объекта), операция -> разыменовывает указатель и получает доступ к объекту, обращается к методу экземпляра класса
в С++ экземпляр класса могут называть объектом
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
06.06.2010, 13:23 #16
Память под статический объект выделяется на этапе компиляции. Грубо говоря, они размещаются в самом исполняемом файле. Глобальные статические объекты инициализируются до выполнения main, локальные - при первом заходе в содержащую их функцию. Разрушаются после выхода из main.
Автоматические объекты размещаются на стеке. Выделение памяти и инициализация происходит при заходе в область видимости (scope), разрушается объект при выходе из этой области.
Динамические объекты создаются и разрушаются по ходу выполнения программы явным образом. А когда их забывают вовремя уничтожить, тут-то и начинается веселье и утечки памяти и других ресурсов.
0
06.06.2010, 13:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2010, 13:23

Запись и чтение динамических объектов в файл
Как быть, че делать? Особенно при чтение файла, ведь неизвестно какого он...

Нехватка памяти при создании динамических объектов
Создаю 4 динамических объекта. 3 вектора и матрица. матрица - это результат...

Реализовать движущийся графический объект с помощью статических и динамических объектов
Добрый день. Решаю задачу из методички и поставлена она следующим образом:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru