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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.77
Frakir
 Аватар для Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 14:25     Статический и динамический экземпляры класса #1
В чем разница между статическим и динамическим экземплярами класса?
Мои познания здесь скромны:
1) Разная инициализация.
У меня есть класс Test.
Статический экземпляр создается так:
C++
1
Test stat;
При этом получаем экземпляр класса, который будет находиться в стеке, и для которого, по достижению конца блока кода, будет автоматически вызван деструктор.
Динамический класс создается так:
C++
1
Test dynam = new Test;
Экземпляр помещается в кучу, а мы далее работаем с указателем на экземпляр. Кроме того, требуется ручное удаление экземпляра.
2) Разный синтаксис для вызова методов и членов класса.
Статический экземпляр:
C++
1
stat.MyMethod();
Динамический экземпляр:
C++
1
dynam->MyMethod();
Из текущей картины складывается ощущение, что с динамическими экземплярами одни проблемы: работа через указатели, высокий риск утечки памяти и, возможно, потеря в скорости из-за размещения в куче.
Так зачем же было придумано 2 способа создания экземпляров класса? Что я упускаю из виду?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NIch
 Аватар для NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 14:31     Статический и динамический экземпляры класса #2
Как один из вариантов передавать объект как параметр.
При передаче статического объекта класса будет передаваться копия (а если массив из 1000 объектов?)))), а при передаче динамического, то только ссылки.
Т.е. экономия места.
А если потом еще нужно объединить исходный объект и обработанный?
А передача по ссылке гарантирует, что все манипуляции лишь с одной копией.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.02.2013, 14:43     Статический и динамический экземпляры класса #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A {
}
class B:public А {
}
 
int main(){
A *pA;
B tmpB;
pA = &tmpB;
 
pA->someMethod();//угодай чьи методы будут вызываться?)
return 0;
}
Frakir
 Аватар для Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 14:44  [ТС]     Статический и динамический экземпляры класса #4
Цитата Сообщение от NIch Посмотреть сообщение
При передаче статического объекта класса будет передаваться копия
Но ведь можно указать в функции параметр - ссылку на объект. Получится что-то типа этого:
C++
1
void Function(Test& data);
И работа будет осуществляться с исходным статическим экземпляром класса, а не его копией.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.02.2013, 14:46     Статический и динамический экземпляры класса #5
ах, да сорри, забыл добавить виртуальный метод пусть будет так в каждом классе
C++
1
virtual void someMethod();
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.02.2013, 14:50     Статический и динамический экземпляры класса #6
Я бы всё же не стал называть объекты на стеке статическими. Статический объект применимо к программе на С++ это нечто иное.
Теперь по сути вопроса: представьте, что Вам нужно хранить некие принятые извне данные. Сколько будет этих данных Вам заранее неизвестно и в данном случае не обойтись без динамического выделения памяти.
Чтобы не бояться утечек памяти (а в общем случае любых ресурсов), советую ознакомиться с концепцией RAII.
Frakir
 Аватар для Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 15:01  [ТС]     Статический и динамический экземпляры класса #7
aLarman, вызов метода класса B через класс А... Интересно, иду читать про виртуальные функции.

Цитата Сообщение от Tulosba Посмотреть сообщение
представьте, что Вам нужно хранить некие принятые извне данные. Сколько будет этих данных Вам заранее неизвестно и в данном случае не обойтись без динамического выделения памяти.
Что мне мешает создать статический экземпляр класса, в котором есть член - указатель на динамический массив, под который будет выделяться необходимое место в куче для хранения принятых данных?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.02.2013, 15:05     Статический и динамический экземпляры класса #8
Frakir, почитай еще про ранее и позднее связывание (тема связана с виртуальными функциями тоже)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.02.2013, 15:14     Статический и динамический экземпляры класса #9
Цитата Сообщение от Frakir Посмотреть сообщение
в котором есть член - указатель на динамический массив,
Ну а за указателем кто будет следить? Вы просто переносите проблему в другой уровень косвенности.
Frakir
 Аватар для Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 15:27  [ТС]     Статический и динамический экземпляры класса #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Чтобы не бояться утечек памяти (а в общем случае любых ресурсов), советую ознакомиться с концепцией RAII.
Как я понял из статьи, это, опять же, сделано для статических экземпляров, потому что
1) из RAII:
Можно возбуждать исключения или выходить из функции не беспокоясь о закрытии файла
2) из 1 поста:
Цитата Сообщение от Frakir Посмотреть сообщение
получаем экземпляр класса, который будет находиться в стеке, и для которого, по достижению конца блока кода, будет автоматически вызван деструктор.



Цитата Сообщение от Tulosba Посмотреть сообщение
Ну а за указателем кто будет следить? Вы просто переносите проблему в другой уровень косвенности.
Деструктор? С командой delete[] pointer внутри.
Но я бы очень хотел узнать, как нужно организовывать хранение принятых данных в динамическом экземпляре класса, чтобы имело смысл использовать именно его, а не статический экземпляр, содержащий указатель на динамический массив.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.02.2013, 15:46     Статический и динамический экземпляры класса #11
Цитата Сообщение от Frakir Посмотреть сообщение
Деструктор? С командой delete[] pointer внутри.
Именно. Суть как раз в том, что выражения типа
C++
1
dynam = new Test;
вызываются только в конструкторе, а не в любом месте кода.
На RAII концепции построены в частности "умные" указатели. См. std::unique_ptr, std::shared_ptr и т.п.
Frakir
 Аватар для Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 16:23  [ТС]     Статический и динамический экземпляры класса #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Именно. Суть как раз в том, что выражения типа
C++
1
dynam = new Test;
вызываются только в конструкторе, а не в любом месте кода.
В этом выражении Test - сам по себе конструктор, и вызывая его в конструкторе мы получим 2 экземпляра, один внутри другого. Зачем это? Чтобы сделать 2 перегруженных конструктора, один с выделением памяти под экземпляр, другой - без выделения? Это - суть динамических экземпляров?
NIch
 Аватар для NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 17:06     Статический и динамический экземпляры класса #13
Я так подозреваю, что Tulosba, просто не совсем корректно выразился.
Т.е.
C++
1
dynam = new Test
как раз и вызывает конструктор.
Frakir
 Аватар для Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 17:08  [ТС]     Статический и динамический экземпляры класса #14
Но зачем делать так, если можно и статический экземпляр создать?
Я до сих пор не вижу смысла в динамическом экземпляре
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.02.2013, 17:12     Статический и динамический экземпляры класса #15
Цитата Сообщение от Frakir Посмотреть сообщение
и вызывая его в конструкторе мы получим 2 экземпляра,
Ну мы вроде бы обсуждали выделение памяти под массив и ее освобождение в деструкторе. Я вовсе не говорю, что внутри конструктора Test нужно вызывать еще "dynam = new Test;"
NIch
 Аватар для NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 17:17     Статический и динамический экземпляры класса #16
Статический и динамический массивы. Размер одного устанавливается в момент компиляции другого в момент создания через динамическое выделение памяти. Т.е. через указатели мы можем создать массивы различного размера.
Точно так же и объекты. Их можно создавать или не создавать, в зависимости от логики программы, при статическом создании объект создается в момент компиляции.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.02.2013, 17:23     Статический и динамический экземпляры класса #17
Цитата Сообщение от NIch Посмотреть сообщение
при статическом создании объект создается в момент компиляции.
C++
1
2
3
4
if( time(NULL) % 2 )
{
    int arr[10]; // Создается в момент компиляции ?
}
dederkay
 Аватар для 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
 Аватар для 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];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 17:48     Статический и динамический экземпляры класса
Еще ссылки по теме:

Swap для элементов контейнера указателей на экземпляры абстрактного класса C++
Переделать статический массив в динамический C++
Переделать статический массив в динамический C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.02.2013, 17:48     Статический и динамический экземпляры класса #20
Цитата Сообщение от NIch Посмотреть сообщение
динамическая память очень удобна при использовании одного объекта разными участками программы.
Что нам мешает просто взять адрес (&) переменной в таком случае?
Yandex
Объявления
25.02.2013, 17:48     Статический и динамический экземпляры класса
Ответ Создать тему
Опции темы

Текущее время: 03:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru