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

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

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

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

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

В чем разница между статическим и динамическим экземплярами класса?
Мои познания здесь скромны:
1) Разная инициализация.
У меня есть класс Test.
Статический экземпляр создается так:
C++
1
Test stat;
При этом получаем экземпляр класса, который будет находиться в стеке, и для которого, по достижению конца блока кода, будет автоматически вызван деструктор.
Динамический класс создается так:
C++
1
Test dynam = new Test;
Экземпляр помещается в кучу, а мы далее работаем с указателем на экземпляр. Кроме того, требуется ручное удаление экземпляра.
2) Разный синтаксис для вызова методов и членов класса.
Статический экземпляр:
C++
1
stat.MyMethod();
Динамический экземпляр:
C++
1
dynam->MyMethod();
Из текущей картины складывается ощущение, что с динамическими экземплярами одни проблемы: работа через указатели, высокий риск утечки памяти и, возможно, потеря в скорости из-за размещения в куче.
Так зачем же было придумано 2 способа создания экземпляров класса? Что я упускаю из виду?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 14:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Статический и динамический экземпляры класса (C++):

Разные экземпляры класса ? - C++
Есть класс Visitor и в нем объявленна функция void visitor:: enterToPark(jurassicPark jp){ //Trying to enter to park at every...

Статический и динамический стек - C++
Необходимо разработать программу, реализующую алгоритм стека (10 элементов). Решение необходимо представить в двух вариантах: статическом...

Динамический и статический массив - C++
Подскажите, в чем разница. Имеется статический массив, который просто задается: long mas = { 0 }; Т.е. просто вставляем массив...

Статический указатель класса на объект этого же класса - C++
Не пойму: что в этом коде не так? #include <iostream> #include <cstdlib> using namespace std; struct A { int x; ...

Как перебрать все экземпляры класса? - C++
Здравствуйте! Я начинающий программист..... может и не программист вовсе. Но мне необходимо сделать такую задачу. С классами начала...

Переделать статический массив в динамический - C++
Помогите пожалуйста переделать статический массив в динамический #include <iostream> #include <iomanip> #define N 6 #define M 9 ...

26
NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 17:17 #16
Статический и динамический массивы. Размер одного устанавливается в момент компиляции другого в момент создания через динамическое выделение памяти. Т.е. через указатели мы можем создать массивы различного размера.
Точно так же и объекты. Их можно создавать или не создавать, в зависимости от логики программы, при статическом создании объект создается в момент компиляции.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 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]; // Создается в момент компиляции ?
}
0
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];
Хоть и некоторые компиляторы разрешают такое творить, этого не должно быть.
0
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];
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 17:48 #20
Цитата Сообщение от NIch Посмотреть сообщение
динамическая память очень удобна при использовании одного объекта разными участками программы.
Что нам мешает просто взять адрес (&) переменной в таком случае?
0
NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 18:01 #21
Ничего не мешает.
У тебя есть глобальный огромный объект.
Если он статический и сразу объявлен, то и память будет выделена.
А объявление указателя на него выделит лишь 4 байта. А сам объект к примеру в зависимости от условий можно и не создавать.
ИМХО

Не по теме:

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

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

PS вызывать деструктор руками можно только в одном случае, когда используется placement new
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 18:44 #26
Цитата Сообщение от Jupiter Посмотреть сообщение
вызывать деструктор руками можно только в одном случае, когда используется placement new
Или когда заморачиваешься с аллокаторами.
0
Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 18:54  [ТС] #27
Цитата Сообщение от Jupiter Посмотреть сообщение
когда статический(правильно говорить - автоматический) объект выйдет из области видимости - будет вызван его деструктор 2-й раз(1-й раз вызвали вы сами) - а это неопределенное поведение.
Похоже, что управление временем жизни объекта - первое преимущество динамических экземпляров. Уже что-то
0
25.02.2013, 18:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 18:54
Привет! Вот еще темы с ответами:

Переделать статический массив в динамический - C++
Помогите переделать статический массив в динамический #include <stdio.h> #include <conio.h> #include <math.h> #include...

Переделать статический массив в динамический - C++
Помогите переделать статический массив в динамический. #include <iostream> #include <cstdlib> #include <ctime> using namespace std;...

Вывод контейнера указателей на экземпляры абстрактного класса - C++
Добрый день. Задача требует описать абстрактный класс и несколько наследников этого класса. Затем, описать контейнер (list)...

Переделать статический массив структур в динамический - C++
Имею структуру из 8 эл-ов (массивов чаров и 2 подструктуры). Имею исходные данные (5 штук, строк с ними) под эту структуру. Массив с этими...


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

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

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