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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.62
JamesBlack
37 / 37 / 3
Регистрация: 28.07.2009
Сообщений: 144
#1

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

25.10.2009, 02:24. Просмотров 3624. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2009, 02:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс: конструктор и деструктор (C++):

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

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

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

Добавить в класс хотя бы один конструктор и деструктор - C++
Вот сама программа, заранее спасибо за помощь! #include <iostream> #include <math.h> #include <conio.h> using namespace...

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

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

14
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 10:31 #2
Цитата Сообщение от JamesBlack Посмотреть сообщение
Правильно ли организован конструктор и как организовать деструктор?
Да.
Добавь еще конструктор копии.
C++
1
2
cell(const cell& arg) {
}
1
JamesBlack
37 / 37 / 3
Регистрация: 28.07.2009
Сообщений: 144
25.10.2009, 16:51  [ТС] #3
Цитата Сообщение от niXman Посмотреть сообщение
Да.
Добавь еще конструктор копии.
А деструктор? Как с ним быть? И зачем конструктор копии?
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 16:55 #4
Цитата Сообщение от JamesBlack Посмотреть сообщение
А деструктор?
C++
1
2
~cell() {
}
Цитата Сообщение от JamesBlack Посмотреть сообщение
И зачем конструктор копии?
http://ru.wikipedia.org/wiki/%D0%9A%...BD.D0.B8.D1.8F
0
Evg
Эксперт CАвтор FAQ
18252 / 6377 / 438
Регистрация: 30.03.2009
Сообщений: 17,652
Записей в блоге: 28
25.10.2009, 16:58 #5
Цитата Сообщение от niXman Посмотреть сообщение
Добавь еще конструктор копии.
Автор сказал, что никаких динамических выделений памяти не будет. Конструктор копии тут не нужен
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 17:00 #6
Цитата Сообщение от Evg Посмотреть сообщение
Конструктор копии тут не нужен
Конструктор копии никогда не бывает лишним. А вот привычка не использовать его, в большинстве случаев заканчивается крахом программы.
0
Evg
Эксперт CАвтор FAQ
18252 / 6377 / 438
Регистрация: 30.03.2009
Сообщений: 17,652
Записей в блоге: 28
25.10.2009, 17:10 #7
Цитата Сообщение от JamesBlack Посмотреть сообщение
Или если я объявляю x, y, z в автоматической памяти, то до конца программы она не освободится никак? Просто тогда придется делать x, y, z указателями, а это, как мне многие говорили, довольно глупо делать ссылку на одиночную переменную int.
"если я объявляю x, y, z в автоматической памяти" - фраза не верная по своей сути. x, y, z - это НЕ самостоятельные переменные, это поля класса (т.е. составные части некоторого "большого" типа). Автоматическим, статическим или динамическим у тебя может быть объект (экземпляр) данного класса. А тип (в нашем случае класс) это всего лишь свойство объекта. Например яблоко - это объект (ибо является материальной сущностью), а его цвет - это свойство объекта. Цвет без яблока не может существовать. Точно так же и тип не имеет материальной сущности без объекта

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

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

Добавлено через 1 минуту
Цитата Сообщение от niXman Посмотреть сообщение
Конструктор копии никогда не бывает лишним. А вот привычка не использовать его, в большинстве случаев заканчивается крахом программы.
С учётом того, что ты написал его пустым, от краха программы он не спасёт, а вот человека в заблуждение введёшь
1
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 17:11 #8
Цитата Сообщение от Evg Посмотреть сообщение
С учётом того, что ты написал его пустым, от краха программы он не спасёт, а вот человека в заблуждение введёшь
Вопрос был про конструктор(я дополнил конструктором копии) а не про реализацию оного.
0
Evg
Эксперт CАвтор FAQ
18252 / 6377 / 438
Регистрация: 30.03.2009
Сообщений: 17,652
Записей в блоге: 28
25.10.2009, 17:18 #9
Цитата Сообщение от niXman Посмотреть сообщение
Вопрос был про конструктор(я дополнил конструктором копии) а не про реализацию оного.
Человеку нужен был конкретный ответ на конкретный вопрос. Он поставил вопрос настолько развёрнуто, насколько позволили ему его знания. Ты же его отослал на статью в википедии, из которой он скорее всего мало что поймёт, потому что автор не потрудился объяснить доступно и развёрнуто. Потом ещё привёл пустой copy-конструктор и в контексте всего это выглядело так, как будто именно так и надо писать. И под конец с чистой совестью сказал, что меня мол не просили ничего конкретного, а потому я просто сказал слово "конструктор копии", отослал на википедию и какие ко мне могут быть претензии? Действительно, какие ещё претензии? Остаётся только поапплодировать и покричать "браво!"
0
JamesBlack
37 / 37 / 3
Регистрация: 28.07.2009
Сообщений: 144
25.10.2009, 17:19  [ТС] #10
т.е. если я в программе напишу delete <имя объекта>; то память из под данных будет высвобождена?
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 17:22 #11
Цитата Сообщение от Evg Посмотреть сообщение
Человеку нужен был конкретный ответ на конкретный вопрос. Он поставил вопрос настолько развёрнуто, насколько позволили ему его знания. Ты же его отослал на статью в википедии, из которой он скорее всего мало что поймёт, потому что автор не потрудился объяснить доступно и развёрнуто. Потом ещё привёл пустой copy-конструктор и в контексте всего это выглядело так, как будто именно так и надо писать. И под конец с чистой совестью сказал, что меня мол не просили ничего конкретного, а потому я просто сказал слово "конструктор копии", отослал на википедию и какие ко мне могут быть претензии? Действительно, какие ещё претензии? Остаётся только поапплодировать и покричать "браво!"
Знаю, грешен. Забыл уже, каково быть начинающим.
0
JamesBlack
37 / 37 / 3
Регистрация: 28.07.2009
Сообщений: 144
25.10.2009, 17:32  [ТС] #12
т.е. если я в программе напишу delete <имя объекта>; то память из под данных будет высвобождена?

Просто этот класс cell - ячейка. Он используется как элемнет списка, который будет постоянно получать и удалять элементы. Если память не будет очищаться, то это очень не хорошо :-\
0
Evg
Эксперт CАвтор FAQ
18252 / 6377 / 438
Регистрация: 30.03.2009
Сообщений: 17,652
Записей в блоге: 28
25.10.2009, 17:52 #13
Цитата Сообщение от 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;
}
Код
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
37 / 37 / 3
Регистрация: 28.07.2009
Сообщений: 144
25.10.2009, 17:55  [ТС] #14
СПС огромное! Хорошо, что есть люди, готовые не поленится и все подробно объяснить.
0
Evg
Эксперт CАвтор FAQ
18252 / 6377 / 438
Регистрация: 30.03.2009
Сообщений: 17,652
Записей в блоге: 28
25.10.2009, 17:56 #15
Цитата Сообщение от JamesBlack Посмотреть сообщение
СПС огромное! Хорошо, что есть люди, готовые не поленится и все подробно объяснить.
Когда есть уверенность, что написано будет не впустую - то почему бы и не написать
0
25.10.2009, 17:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2009, 17:56
Привет! Вот еще темы с ответами:

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

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Конструктор и деструктор - C++
Всем привет.Вообщем передо мной стоит такая задача-Отобразить на экране время работы программы, используя конструктор и деструктор.В...

Конструктор, деструктор - C++
Дорогие друзья, программисты. Помогите пожалуйста разобраться с конструктором и деструктором, а так же перегрузкой. Фотография прилагается...


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

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

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