С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.88
mister2010
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 64
#1

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

04.06.2010, 01:27. Просмотров 7244. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Понятие принципа создания динамических объектов (C++):

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

STL вектор динамических объектов - C++
Нужно время от времени ложить в std::vector (или std::list) динамические объекты. Под динамическим объектом здесь понимается объект,...

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

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

запись и чтение динамических объектов в файл - C++
Как быть, че делать? Особенно при чтение файла, ведь неизвестно какого он размера. И как бы все это разместить в одной функции, ну например...

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

15
accept
4828 / 3249 / 165
Регистрация: 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
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 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
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 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
Эксперт С++
2305 / 1675 / 86
Регистрация: 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
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 2
Завершенные тесты: 1
05.06.2010, 16:19 #8
Цитата Сообщение от mister2010 Посмотреть сообщение
Код
Box *d = new Box; 
d->f(); //Это вызов функции объекта класса через указатель.
Где здесь объект класса?
на него (объект) указывает d, поэтому к ф-ции обращение через оператор "стрелка"

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Объект в памяти. В стеке или в куче - в зависимости от таго как объект создан.
А что, объект может хранится в стеке??? Что-то я сомневаюсь.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.06.2010, 16:26 #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
А что, объект может хранится в стеке??? Что-то я сомневаюсь.
Хорошо, что по твоему такое стек и по каким причинам в нем не может храниться объект?
И где он храниться, если не рамещен в куче оператором new?
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,389
Записей в блоге: 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
Эксперт С++
2305 / 1675 / 86
Регистрация: 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
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.06.2010, 17:42 #14
Цитата Сообщение от mister2010 Посмотреть сообщение
Статический объект или динамический?
Хорошо, давай так. Перечисли свою "классификацию" (статический, динамический и т.д.) объектов и что ты под этим подразумаваешь.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
06.06.2010, 08:57 #15
Цитата Сообщение от mister2010
Если я напишу d->ser(); Где тут указание на объект?
Это указатель на функцию класса.
d указатель на объект (хранит адрес объекта), операция -> разыменовывает указатель и получает доступ к объекту, обращается к методу экземпляра класса
в С++ экземпляр класса могут называть объектом
0
06.06.2010, 08:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2010, 08:57
Привет! Вот еще темы с ответами:

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

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти - C++
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации...

Способы создания объектов и арифметика указателей - C++
Вот сам код: class ListNode { public: ListNode(int val) { next=NULL; i=val; } ListNode*...

Практическое применение классов без создания объектов этого класса - C++
Приветствую всех! Читай книгу Р. Лафоре &quot;ООП в C++&quot; увидел вопрос: &quot;Истинно ли следующее утверждение: иногда полезно создать класс,...


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

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

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