Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/27: Рейтинг темы: голосов - 27, средняя оценка - 4.93
 Аватар для JamesBlack
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144

Класс: конструктор и деструктор

25.10.2009, 02:24. Показов 5646. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возник вопрос. Если я в классе не делаюни одного данного с выделением динамической памяти, то как мне организовать конструктор и деструктор?
P.S. объекты этого класса используются в других классах, точнее ссылка на объект этого класса - одно из данных других классов.

Конкретный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class cell
{
    private:
        int x;
        int y;
        double z;
        cell *next;
        cell *prev;
    public:
        cell(int, int, double);
        ~cell();
};
 
cell::cell(int _x, int _y, double _z)
{
    x=_x;
    y=_y;
    z=_z;
    next = NULL;
    prev = NULL;
};
Правильно ли организован конструктор и как организовать деструктор?

Добавлено через 8 минут
Или если я объявляю x, y, z в автоматической памяти, то до конца программы она не освободится никак? Просто тогда придется делать x, y, z указателями, а это, как мне многие говорили, довольно глупо делать ссылку на одиночную переменную int.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.10.2009, 02:24
Ответы с готовыми решениями:

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

Добавить в класс конструктор и деструктор
Помогите пожалуйста добавить в класс конструктор и деструктор. Заранее спасибо ) #include "stdafx.h" #include...

Класс, конструктор, деструктор и прочее
Добрый день. Есть задание: Написать программу работы с матрицами (матрица представляет собой двумерный массив). Матрица является...

14
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 10:31
Цитата Сообщение от JamesBlack Посмотреть сообщение
Правильно ли организован конструктор и как организовать деструктор?
Да.
Добавь еще конструктор копии.
C++
1
2
cell(const cell& arg) {
}
1
 Аватар для JamesBlack
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
25.10.2009, 16:51  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
Да.
Добавь еще конструктор копии.
А деструктор? Как с ним быть? И зачем конструктор копии?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 16:55
Цитата Сообщение от JamesBlack Посмотреть сообщение
А деструктор?
C++
1
2
~cell() {
}
Цитата Сообщение от JamesBlack Посмотреть сообщение
И зачем конструктор копии?
http://ru.wikipedia.org/wiki/%... 0.B8.D1.8F
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.10.2009, 16:58
Цитата Сообщение от niXman Посмотреть сообщение
Добавь еще конструктор копии.
Автор сказал, что никаких динамических выделений памяти не будет. Конструктор копии тут не нужен
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 17:00
Цитата Сообщение от Evg Посмотреть сообщение
Конструктор копии тут не нужен
Конструктор копии никогда не бывает лишним. А вот привычка не использовать его, в большинстве случаев заканчивается крахом программы.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.10.2009, 17:10
Цитата Сообщение от JamesBlack Посмотреть сообщение
Или если я объявляю x, y, z в автоматической памяти, то до конца программы она не освободится никак? Просто тогда придется делать x, y, z указателями, а это, как мне многие говорили, довольно глупо делать ссылку на одиночную переменную int.
"если я объявляю x, y, z в автоматической памяти" - фраза не верная по своей сути. x, y, z - это НЕ самостоятельные переменные, это поля класса (т.е. составные части некоторого "большого" типа). Автоматическим, статическим или динамическим у тебя может быть объект (экземпляр) данного класса. А тип (в нашем случае класс) это всего лишь свойство объекта. Например яблоко - это объект (ибо является материальной сущностью), а его цвет - это свойство объекта. Цвет без яблока не может существовать. Точно так же и тип не имеет материальной сущности без объекта

Цитата Сообщение от JamesBlack Посмотреть сообщение
А деструктор? Как с ним быть?
Деструктор нужен только тогда, когда тебе нужны какие-то завершающие действия в момент удаления объекта (например, удаление динамической памяти, которую использовал объект). В твоём случае объект не делает никаких телодвижений, требующих завершения, а потому он попросту не нужен. Ну или можно его написать, но оставить пустым

Цитата Сообщение от JamesBlack Посмотреть сообщение
И зачем конструктор копии?
При копировании объектов действие по умолчанию - это простое копирование всех полей. Когда этого недостаточно, то пишут свой конструктор копии. Как правило это так же упирается в работу с динамической памятью. Если объект выделил себе динамическую память, то копия объекта должна использовать собственную динамическую память, а потому придётся писать конструктор копии. В твоём случае опять-таки нет никакой работы с динамической памятью, поэтому конструктор копии не нужен (компилятор сам создаст его, и он будет тупо переписывать все значения полей)

Добавлено через 1 минуту
Цитата Сообщение от niXman Посмотреть сообщение
Конструктор копии никогда не бывает лишним. А вот привычка не использовать его, в большинстве случаев заканчивается крахом программы.
С учётом того, что ты написал его пустым, от краха программы он не спасёт, а вот человека в заблуждение введёшь
1
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 17:11
Цитата Сообщение от Evg Посмотреть сообщение
С учётом того, что ты написал его пустым, от краха программы он не спасёт, а вот человека в заблуждение введёшь
Вопрос был про конструктор(я дополнил конструктором копии) а не про реализацию оного.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.10.2009, 17:18
Цитата Сообщение от niXman Посмотреть сообщение
Вопрос был про конструктор(я дополнил конструктором копии) а не про реализацию оного.
Человеку нужен был конкретный ответ на конкретный вопрос. Он поставил вопрос настолько развёрнуто, насколько позволили ему его знания. Ты же его отослал на статью в википедии, из которой он скорее всего мало что поймёт, потому что автор не потрудился объяснить доступно и развёрнуто. Потом ещё привёл пустой copy-конструктор и в контексте всего это выглядело так, как будто именно так и надо писать. И под конец с чистой совестью сказал, что меня мол не просили ничего конкретного, а потому я просто сказал слово "конструктор копии", отослал на википедию и какие ко мне могут быть претензии? Действительно, какие ещё претензии? Остаётся только поапплодировать и покричать "браво!"
0
 Аватар для JamesBlack
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
25.10.2009, 17:19  [ТС]
т.е. если я в программе напишу delete <имя объекта>; то память из под данных будет высвобождена?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 17:22
Цитата Сообщение от Evg Посмотреть сообщение
Человеку нужен был конкретный ответ на конкретный вопрос. Он поставил вопрос настолько развёрнуто, насколько позволили ему его знания. Ты же его отослал на статью в википедии, из которой он скорее всего мало что поймёт, потому что автор не потрудился объяснить доступно и развёрнуто. Потом ещё привёл пустой copy-конструктор и в контексте всего это выглядело так, как будто именно так и надо писать. И под конец с чистой совестью сказал, что меня мол не просили ничего конкретного, а потому я просто сказал слово "конструктор копии", отослал на википедию и какие ко мне могут быть претензии? Действительно, какие ещё претензии? Остаётся только поапплодировать и покричать "браво!"
Знаю, грешен. Забыл уже, каково быть начинающим.
0
 Аватар для JamesBlack
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
25.10.2009, 17:32  [ТС]
т.е. если я в программе напишу delete <имя объекта>; то память из под данных будет высвобождена?

Просто этот класс cell - ячейка. Он используется как элемнет списка, который будет постоянно получать и удалять элементы. Если память не будет очищаться, то это очень не хорошо :-\
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.10.2009, 17:52
Цитата Сообщение от JamesBlack Посмотреть сообщение
т.е. если я в программе напишу delete <имя объекта>; то память из под данных будет высвобождена?
Только не имя объекта, а имя указателя на объект (т.е. на динамически выделенный объект). Память из-под чего угодно в момент завершения программы ВСЕГДА будет освобождаться (т.е. криво написанная программа не приведёт к тому, что упадёт машина из-за нехватки памяти).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Это - глобальный объект (так называемый объект со статическим
// временем жизни. Он "создастся" до того, как мы попадём в main. Т.е. его
// конструктор будет вызван ДО того, как мы попадём в main. Объект "удалится"
// после того, как мы выйдем из main и деструктор будет запущен ПОСЛЕ того,
// как мы выйдем из main
cell G;
 
...
 
void func1 (void)
{
  // Локальный объект (объект с автоматическим временем жизни). Объект "рожается"
  // когда мы заходим в функцию func1. Объект удаляется в момент выхода из функции.
  // Неважно, произойдёт это по достижении конца функции, или если return встретится
  // где-то посередине функции. В моменты рождения и удаления объекта будут вызваны
  // соответственно конструктор и деструктор
  cell a1;
 
  ...
 
  if (...)
  {
    // Этот объект определён внутри фигурных скобок. Он родится тогда, когда мы попадём
    // в код, соответствующий этой паре фигурных скобок. Удалится по выходу за пределы
    // фигурных скобок (даже если мы выйдем за пределы через goto или return). В моменты
    // рождения и удаления объекта будут вызваны соответственно конструктор и деструктор.
    // Если мы в данную ветку if'а не зайдём, то объект и не родится
    cell a2;
    ...
  }
 
  // Создаём объект динамически. В момент рождения будет вызван конструктор. Объект
  // удаляется через delete, который необязательно должен быть где-то в этой функции.
  // Он может быть где угодно. Если до завершения программы delete не был вызван, то объект
  // всё равно удалится, но деструктор НЕ будет вызван. Если в деструкторе делаются какие-то
  // "внешние" действия, например, запись в файл, то эти действия потеряются
  cell *p = new cell;
}
Есть ещё моменты, связанные с проводкой exception'ов через активации функции, но пока я думаю, тебя это не будет волновать.

Со всем этим хозяйством ты можешь сам экспериментировать, воткнув печати в конструктор и деструктор. Единственно, печати нужно организовывать так, чтобы можно было понять, что чему соответствует

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
using namespace std;
 
class T
{
  private:
    int x;
 
  public:
    T (int _x)
    {
      x = _x;
      cout << "constr " << x << endl;
    }
 
    ~T ()
    {
      cout << "destr " << x << endl;
    }
};
 
T glob(10);
 
T *ptr;
 
void
func (void)
{
  cout << "start func" << endl;
  T auto1(20);
 
  for (int i = 0; i < 5; i++)
  {
    cout << "start 'for' body" << endl;
    T auto2(30+i);
 
    if (i == 3)
    {
      cout << "start 'if' body" << endl;
      T auto2(40);
      cout << "finish 'if' body" << endl;
    }
 
    if (i == 4)
    {
      ptr = new T(50);
    }
 
    cout << "finish 'for' body" << endl;
  }
  cout << "finsih func" << endl;
}
 
int
main (void)
{
  cout << "start main" << endl;
  func ();
  cout << "after func" << endl;
  delete ptr;
  cout << "finish main" << endl;
  return 0;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
constr 10
start main
start func
constr 20
start 'for' body
constr 30
finish 'for' body
destr 30
start 'for' body
constr 31
finish 'for' body
destr 31
start 'for' body
constr 32
finish 'for' body
destr 32
start 'for' body
constr 33
start 'if' body
constr 40
finish 'if' body
destr 40
finish 'for' body
destr 33
start 'for' body
constr 34
constr 50
finish 'for' body
destr 34
finsih func
destr 20
after func
destr 50
finish main
destr 10
Добавлено через 3 минуты
Одна из распространённых ошибок начинающих: конструктор и деструктор НЕ занимаются выделением памяти. Конструктор вызывается после того, как объект родился, неважно каким образом и кем под него выделена память. Деструктор вызывается перед освобождением памяти, выделенной под обхект, неважно кто и как будет удалять память

Добавлено через 50 секунд
Цитата Сообщение от niXman Посмотреть сообщение
Знаю, грешен. Забыл уже, каково быть начинающим.
Это уже конструктивный разговор
2
 Аватар для JamesBlack
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
25.10.2009, 17:55  [ТС]
СПС огромное! Хорошо, что есть люди, готовые не поленится и все подробно объяснить.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.10.2009, 17:56
Цитата Сообщение от JamesBlack Посмотреть сообщение
СПС огромное! Хорошо, что есть люди, готовые не поленится и все подробно объяснить.
Когда есть уверенность, что написано будет не впустую - то почему бы и не написать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.10.2009, 17:56
Помогаю со студенческими работами здесь

Класс, конструктор, деструктор, дружественные функции
Нужна помощь с ООП. Вот задание: Общая постановка. Пользовательский класс Х должен содержать необходимые элементы-данные, которые...

Добавить в класс хотя бы один конструктор и деструктор
Вот сама программа, заранее спасибо за помощь! #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; using...

Создать любой класс. Реализовать конструктор, деструктор, продемонстрировать работу
помогите создать класс любой можно про автомобиль,мяч,прямоугольник и тд...,чтобы были конструктор,диструктор,продемонстрировать работу.. ...

Разработать класс Airplane (самолет). Определить конструктор и деструктор. Реализовать объявленные методы доступа к данным.
решите пожалуйста вот эту задачу, вроде бы простая.. и если можно объясните, что где что значит. (С++) Разработать класс Airplane...

Класс "Матрица": конструктор, деструктор и перегрузка операторов
Матрица – KMatrix Методы: конструкторы, деструктор; операции: , =, ==, !=,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru