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

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

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

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

25.02.2013, 14:25. Просмотров 4192. Ответов 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, 14:31 #2
Как один из вариантов передавать объект как параметр.
При передаче статического объекта класса будет передаваться копия (а если массив из 1000 объектов?)))), а при передаче динамического, то только ссылки.
Т.е. экономия места.
А если потом еще нужно объединить исходный объект и обработанный?
А передача по ссылке гарантирует, что все манипуляции лишь с одной копией.
0
aLarman
642 / 563 / 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;
}
0
Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 14:44  [ТС] #4
Цитата Сообщение от NIch Посмотреть сообщение
При передаче статического объекта класса будет передаваться копия
Но ведь можно указать в функции параметр - ссылку на объект. Получится что-то типа этого:
C++
1
void Function(Test& data);
И работа будет осуществляться с исходным статическим экземпляром класса, а не его копией.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
25.02.2013, 14:46 #5
ах, да сорри, забыл добавить виртуальный метод пусть будет так в каждом классе
C++
1
virtual void someMethod();
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 14:50 #6
Я бы всё же не стал называть объекты на стеке статическими. Статический объект применимо к программе на С++ это нечто иное.
Теперь по сути вопроса: представьте, что Вам нужно хранить некие принятые извне данные. Сколько будет этих данных Вам заранее неизвестно и в данном случае не обойтись без динамического выделения памяти.
Чтобы не бояться утечек памяти (а в общем случае любых ресурсов), советую ознакомиться с концепцией RAII.
0
Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 15:01  [ТС] #7
aLarman, вызов метода класса B через класс А... Интересно, иду читать про виртуальные функции.

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



Цитата Сообщение от Tulosba Посмотреть сообщение
Ну а за указателем кто будет следить? Вы просто переносите проблему в другой уровень косвенности.
Деструктор? С командой delete[] pointer внутри.
Но я бы очень хотел узнать, как нужно организовывать хранение принятых данных в динамическом экземпляре класса, чтобы имело смысл использовать именно его, а не статический экземпляр, содержащий указатель на динамический массив.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 15:46 #11
Цитата Сообщение от Frakir Посмотреть сообщение
Деструктор? С командой delete[] pointer внутри.
Именно. Суть как раз в том, что выражения типа
C++
1
dynam = new Test;
вызываются только в конструкторе, а не в любом месте кода.
На RAII концепции построены в частности "умные" указатели. См. std::unique_ptr, std::shared_ptr и т.п.
0
Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 16:23  [ТС] #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Именно. Суть как раз в том, что выражения типа
C++
1
dynam = new Test;
вызываются только в конструкторе, а не в любом месте кода.
В этом выражении Test - сам по себе конструктор, и вызывая его в конструкторе мы получим 2 экземпляра, один внутри другого. Зачем это? Чтобы сделать 2 перегруженных конструктора, один с выделением памяти под экземпляр, другой - без выделения? Это - суть динамических экземпляров?
0
NIch
399 / 310 / 27
Регистрация: 17.03.2010
Сообщений: 1,120
25.02.2013, 17:06 #13
Я так подозреваю, что Tulosba, просто не совсем корректно выразился.
Т.е.
C++
1
dynam = new Test
как раз и вызывает конструктор.
0
Frakir
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 8
25.02.2013, 17:08  [ТС] #14
Но зачем делать так, если можно и статический экземпляр создать?
Я до сих пор не вижу смысла в динамическом экземпляре
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.02.2013, 17:12 #15
Цитата Сообщение от Frakir Посмотреть сообщение
и вызывая его в конструкторе мы получим 2 экземпляра,
Ну мы вроде бы обсуждали выделение памяти под массив и ее освобождение в деструкторе. Я вовсе не говорю, что внутри конструктора Test нужно вызывать еще "dynam = new Test;"
0
25.02.2013, 17:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 17:12
Привет! Вот еще темы с ответами:

Переделать статический массив в динамический - 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 штук, строк с ними) под эту структуру. Массив с этими...


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

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

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