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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как поменять вид курсора на в ВинАпи http://www.cyberforum.ru/cpp-beginners/thread58704.html
Здравствуйте Нужно поменять курсор при нажатии пункта меню. Сделала меню, два курсора, .. зависла на WM_COMMAND case WM_COMMAND: { switch(LOWORD(wParam)) { case IDM_FILE_CURSOR: if (a==1) a=0;
C++ целочисленная прямоугольная матрица Дана целочисленная прямоугольная матрица. Определить: 1)количество столбцов, содержащих хотя бы один нулевой элемент (оформить в виде функции) 2)номер строки,в котором находится максимальное количество полных квадратов (оформить в виде процедуры) Добавлено через 22 секунды Пожалуйста помогите!!! http://www.cyberforum.ru/cpp-beginners/thread58691.html
C++ Для заданной марицы вычислить значение среднего арифметического элементов k-го столбца и n-й строки
Написать функцию, которая для заданного двухмерного массива типа int вычисляет и возвращает значение среднего арифметического элементов k-го столбца и п-й строки. Написать программу, которая описывает и задает значения элементов массива А размерностью 3*4, описывает и вводит с клавиатуры массив В размерностью 2*3, вычисляет и выводит на экран сумму средних арифметических первого столбца и...
Строки, которые одновременно содержатся в двух заданных текстовых файлах C++
ребята помогите Пожалуйста!!!! Условие:Написать программу, выводящую на экран строки, которые одновременно содержатся в двух заданных текстовых файлах. Имена файлов прочесть с клавиатуры. Сами файлы с текстом предварительно создать на любом из доступных дисков.
C++ Вопрос по нажатию клавиш http://www.cyberforum.ru/cpp-beginners/thread58688.html
Смотрю книги и уроки по Си, но не в одной не чего не упоминается о такой вещи: Например как сделать, что бы в консольном при нажатии например клавиши ENTER - выводилось например вы нажали клавишу ENTER , при нажатии например клавиши CTRL - выводилось например вы нажали клавишу CTRL Типа if (нажата клавиша ENTER) { cout<<"вы нажали клавишу ENTER "; }
C++ Проверка правильности ввода строки Доброго дня! Имеется строка string str, задана изначально, пользователь вводит с клавиатуры другую строку string proverka, нужно проверить полное осимвольное совпадание двух строк. Есть ли какя-нибудь встроенная функция или надо самому прогаммировать? :) Что-то вроде проверки правильности ввода пароля. Если хотя бы один символ не совпадает, то всё, строка введена неверно. подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17468 / 5706 / 362
Регистрация: 30.03.2009
Сообщений: 15,663
Записей в блоге: 26
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;
}
Код
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 Посмотреть сообщение
Знаю, грешен. Забыл уже, каково быть начинающим.
Это уже конструктивный разговор
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru