Конструкторы и Деструкторы Конструкторы - функции, явно предназначенные для инициализации объектов Деструкторы - функция обратная конструктору для обеспечения.

Презентация:



Advertisements
Похожие презентации
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Advertisements

Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
1 Переопределение операций Макаревич Л. Г.. 2 Зачем нужна перегрузка операций? class Complex { double re; double im; public: Complex(double r=0, double.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
ООП Классы – 2.
Абстрактные типы данных Май Основные вопросы Определение типа и поколения языков программирования Понятия абстракции и абстрактного типа данных.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Объектно-ориентированный подход в языке C#. Класс в языке C# - ссылочный тип, определенный пользователем. Для классов ЯП C# допустимо только единичное.
Лекция 10 Класс как абстрактный тип. Подбельский гл. 9, Страуструп гл. Конструкторы и деструктор Конструкторы - это специальные функции-члены класса, предназначенные.
Лекция 12 Перегрузка операторов. Часть 2. Подбельский гл. 9.7, Страуструп гл. 11, Мейрс п. 11,15-17,19. Перегрузка копирующего конструктора T(const T&)
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Д.з Язык С++ - занятие 31. Задача 1: 1/1 + 1/3 + 1/5 … #include using namespace std; int main() { int n; cin >> n; double sum = 0;// Сумма for.
Статические поля класса Статические поля хранят данные, общие для всех элементов класса. Статическое поле существует в единственном экземпляре для всех.
Visual C++ Классы и объекты языка. Человек - примитивный Голова Туловище Руки Ноги Зрение Умение держать предмет в руках Могу ходить.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
Лекция 8 Область видимости Время жизни. Область видимости Область видимости – характеристика именованного объекта Область видимости - часть текста программы,
Лекция 9. Введение в ООП. Часть 2 Красс Александр СПбГУ ИТМО, 2008.
Множественное наследование class A {... }; class B {... }; class C : public A, protected B {... }; !!! Спецификатор доступа распространяется только на.
Транксрипт:

Конструкторы и Деструкторы Конструкторы - функции, явно предназначенные для инициализации объектов Деструкторы - функция обратная конструктору для обеспечения соответствующей очистки объектов

Использование set() приводит к ошибкам. Можно забыть задать начальные значения или сделать это несколько раз class date { date(int, int, int); }; Если для конструктора нужны параметры, они должны задаваться: date today = date(23,6,1983); date xmas(25,12,0); // сокращенная форма (xmas - рождество) date my_burthday; // недопустимо, опущена инициализация

Часто бывает хорошо обеспечить несколько способов инициализации объекта класса. Это можно сделать, задав несколько конструкторов class date { int month, day, year; public: date(int, int, int); // день месяц год date(char*); // дата в строковом представлении date(int); // день, месяц и год сегодняшние date(); // дата по умолчанию: сегодня }; date today(4); date july4("Июль 4, 1983"); date guy("5 Ноября"); date now; // инициализируется по умолчанию

Один из способов сократить число родственных функций – использовать параметры по умолчанию class date { int month, day, year; public: date(int d=0, int m=0, int y=0); date(char*); // дата в строковом представлении }; date::date(int d, int m, int y) { // проверка, что дата допустимая day=d; month=m; year=y; }

Деструкторы - функция обратная конструктору для обеспечения соответствующей очистки объектов class char_stack { int size; char* top; char* s; public: char_stack(int sz){ top=s=new char[size=sz]; } ~char_stack() { delete s; } // деструктор void push(char c) { *top++ = c; } char pop(){ return *--top;} };

Когда объект класса char_stack выходит из области видимости, вызывается деструктор: void f() { char_stack s1(100); char_stack s2(200); s1.push('a'); s2.push(s1.pop()); char ch = s2.pop(); cout

Объекты могут создаваться как: [1] Автоматический объект: создается каждый раз, когда его описание встречается при выполнении программы, и уничтожается каждый раз при выходе из блока, в котором оно появилось; [2] Статический объект: создается один раз, при запуске программы, и уничтожается один раз, при ее завершении; [3] Объект в свободной памяти: создается с помощью операции new и уничтожается с помощью операции delete; [4] Объект член: как объект другого класса или как элемент вектора.

Предостережение: Если x и y - объекты класса cl, то x = y в стандартном случае означает побитовое копирование y в x Такая интерпретация присваивания может привести к нежелательному результату

class char_stack { int size; char* top; char* s; public: char_stack(int sz) { top=s=new char[size=sz]; } // конструктор ~char_stack() { delete s; } // деструктор void push(char c) { *top++ = c; } char pop() { return *--top; } }; void h() { char_stack s1(100); char_stack s2 = s1; char_stack s3(99); s3 = s2; // неприятность }

Конструктор char_stack::char_stack() вызывается дважды: для s1 и для s3. Для s2 он не вызывается, поскольку эта переменная инициализируется присваиванием. Однако деструктор char_stack::~char_stack() вызывается трижды: для s1, s2 и s3 ! По умолчанию действует интерпретация присваивания как побитовое копирование, поэтому в конце h() каждый из s1, s2 и s3 будет содержать указатель на вектор символов, размещенный в свободной памяти при создании s1. Не останется никакого указателя на вектор символов, выделенный при создании s3 Это приведет, в лучшем случаю, к краху системы. (Обычно результатом применения delete дважды к одному указателю приводит к бесконечному циклу)