Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.77
Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
#1

Статический и динамический экземпляры класса - C++

25.02.2013, 14:25. Просмотров 3887. Ответов 26
Метки нет (Все метки)

В чем разница между статическим и динамическим экземплярами класса?
Мои познания здесь скромны:
1) Разная инициализация.
У меня есть класс Test.
Статический экземпляр создается так:
C++
1
Test stat;
При этом получаем экземпляр класса, который будет находиться в стеке, и для которого, по достижению конца блока кода, будет автоматически вызван деструктор.
Динамический класс создается так:
C++
1
Test dynam = new Test;
Экземпляр помещается в кучу, а мы далее работаем с указателем на экземпляр. Кроме того, требуется ручное удаление экземпляра.
2) Разный синтаксис для вызова методов и членов класса.
Статический экземпляр:
C++
1
stat.MyMethod();
Динамический экземпляр:
C++
1
dynam->MyMethod();
Из текущей картины складывается ощущение, что с динамическими экземплярами одни проблемы: работа через указатели, высокий риск утечки памяти и, возможно, потеря в скорости из-за размещения в куче.
Так зачем же было придумано 2 способа создания экземпляров класса? Что я упускаю из виду?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 14:25     Статический и динамический экземпляры класса
Посмотрите здесь:
Разные экземпляры класса ? C++
C++ Статический и динамический стек
C++ Динамический и статический массив
C++ Статический указатель класса на объект этого же класса
Переделать статический массив в динамический C++
Переделать статический массив в динамический C++
Переделать статический массив в динамический C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 17:17     Статический и динамический экземпляры класса #16
Статический и динамический массивы. Размер одного устанавливается в момент компиляции другого в момент создания через динамическое выделение памяти. Т.е. через указатели мы можем создать массивы различного размера.
Точно так же и объекты. Их можно создавать или не создавать, в зависимости от логики программы, при статическом создании объект создается в момент компиляции.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 17:23     Статический и динамический экземпляры класса #17
Цитата Сообщение от NIch Посмотреть сообщение
при статическом создании объект создается в момент компиляции.
C++
1
2
3
4
if( time(NULL) % 2 )
{
    int arr[10]; // Создается в момент компиляции ?
}
dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
25.02.2013, 17:36     Статический и динамический экземпляры класса #18
Цитата Сообщение от Tulosba Посмотреть сообщение
при статическом создании объект создается в момент компиляции.
Я думаю что NIch имеет в виду именно то что в стеке нельзя определить массив во время работы программы, т.е
C++
1
2
3
int a;
std::cin>>a;
int arr[a];
Хоть и некоторые компиляторы разрешают такое творить, этого не должно быть.
NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 17:37     Статический и динамический экземпляры класса #19
Я говорю о глобальных объектах.
Цитата Сообщение от Tulosba Посмотреть сообщение
Создается в момент компиляции ?
В твоем случае это стековая память, она очистится как только ты выйдешь за пределы if.
И передать его можно только создав копию.
Как я писал ранее, динамическая память очень удобна при использовании одного объекта разными участками программы.

C++
1
2
3
4
5
//Глобальная переменная 1:
int * a;
 
//Глобальная переменная 2:
int a1[10];
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 17:48     Статический и динамический экземпляры класса #20
Цитата Сообщение от NIch Посмотреть сообщение
динамическая память очень удобна при использовании одного объекта разными участками программы.
Что нам мешает просто взять адрес (&) переменной в таком случае?
NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 18:01     Статический и динамический экземпляры класса #21
Ничего не мешает.
У тебя есть глобальный огромный объект.
Если он статический и сразу объявлен, то и память будет выделена.
А объявление указателя на него выделит лишь 4 байта. А сам объект к примеру в зависимости от условий можно и не создавать.
ИМХО

Не по теме:

Я вот только не пойму, ты хочешь мне рассказать о преимуществах, недостатках и особенностях использования динамических и статических объектов или топик стартеру.
По моему, это он писал о том зачем использовать (*) когда можно (&).

Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.02.2013, 18:08     Статический и динамический экземпляры класса #22
Цитата Сообщение от Frakir Посмотреть сообщение
Но зачем делать так, если можно и статический экземпляр создать?
Я до сих пор не вижу смысла в динамическом экземпляре
смысл в том чотбы управлять временем жизни объекта
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 18:09     Статический и динамический экземпляры класса #23
Цитата Сообщение от NIch Посмотреть сообщение
Не по теме:
Я вот только не пойму, ты хочешь мне рассказать о преимуществах, недостатках и особенностях использования динамических и статических объектов или топик стартеру.
По моему, это он писал о том зачем использовать (*) когда можно (&).
Пытаюсь разобраться в твоих формулировках.
Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 18:23  [ТС]     Статический и динамический экземпляры класса #24
Цитата Сообщение от Jupiter Посмотреть сообщение
смысл в том чотбы управлять временем жизни объекта
В таком случае можно просто вызвать деструктор:
C++
1
stat.~Test();
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.02.2013, 18:38     Статический и динамический экземпляры класса #25
Цитата Сообщение от Frakir Посмотреть сообщение
В таком случае можно просто вызвать деструктор:
нет, нельзя.
когда статический(правильно говорить - автоматический) объект выйдет из области видимости - будет вызван его деструктор 2-й раз(1-й раз вызвали вы сами) - а это неопределенное поведение.

PS вызывать деструктор руками можно только в одном случае, когда используется placement new
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 18:44     Статический и динамический экземпляры класса #26
Цитата Сообщение от Jupiter Посмотреть сообщение
вызывать деструктор руками можно только в одном случае, когда используется placement new
Или когда заморачиваешься с аллокаторами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 18:54     Статический и динамический экземпляры класса
Еще ссылки по теме:
C++ Вывод контейнера указателей на экземпляры абстрактного класса
C++ Заменить в программе статический массив на динамический
C++ Как перевести статический массив в динамический?
Нужно переделать статический массив в динамический C++
C++ как лучше сделать хранение ссылок на экземпляры класса?

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

Или воспользуйтесь поиском по форуму:
Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 18:54  [ТС]     Статический и динамический экземпляры класса #27
Цитата Сообщение от Jupiter Посмотреть сообщение
когда статический(правильно говорить - автоматический) объект выйдет из области видимости - будет вызван его деструктор 2-й раз(1-й раз вызвали вы сами) - а это неопределенное поведение.
Похоже, что управление временем жизни объекта - первое преимущество динамических экземпляров. Уже что-то
Yandex
Объявления
25.02.2013, 18:54     Статический и динамический экземпляры класса
Ответ Создать тему
Опции темы

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