Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование_ответы.docx
Скачиваний:
8
Добавлен:
22.09.2019
Размер:
138.16 Кб
Скачать

33. Использование конструктора и деструктора.

В объектно-ориентированном программировании конструктор класса — специальный блок инструкций, вызываемый при создании объекта.

Конструктор схож с методом, но отличается от метода тем, что не имеет явным образом определённого типа возвращаемых данных, не наследуется, и обычно имеет различные правила для рассматриваемых модификаторов. Конструкторы часто выделяются наличием одинакового имени с именем класса, в котором объявляется. Их задача — инициализировать члены объекта и определить инвариант класса, сообщив в случае некорректности инварианта. Корректно написанный конструктор оставит объект в «правильном» состоянии. Неизменяемые объекты тоже должны быть проинициализированы конструктором.

Назначение конструктора. Одна из ключевых особенностей ООП — инкапсуляция: внутренние поля объекта напрямую недоступны, и пользователь может работать с объектом только как с единым целым, через открытые (public) методы. Каждый метод, в идеале, должен быть устроен так, чтобы объект, находящийся в «допустимом» состоянии (то есть когда выполняется инвариант класса), после вызова метода также оказался в допустимом состоянии. И первая задача конструктора — перевести поля объекта в такое состояние.

Вторая задача — упростить пользование объектом. Объект — не «вещь в себе», ему часто приходится требовать какую-то информацию от других объектов: например, объект File, создаваясь, должен получить имя файла. Это можно сделать и через метод:

File file;

file.open("in.txt", File::omRead);

Но удобнее открытие файла сделать в конструкторе:

File file("in.txt", File::omRead);

Пример:

TClassWithConstructor = class

public

constructor Create;

end;

Дестру́ктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти). Для объявления деструктора в Delphi используется ключевое слово destructor. Имя деструктора может быть любым, но рекомендуется всегда называть деструктор Destroy.

TClassWithDestructor = class

destructor Destroy; override;

end;

В Delphi все классы являются потомками, по крайней мере, класса TObject, поэтому, для корректного освобождения памяти, необходимо перекрывать деструктор, используя директиву override.

В Delphi прямой вызов деструктора используется редко. Вместо него используют метод Free.

MyObject.Free;

Метод Free вначале проверяет существует ли уничтожаемый объект, а затем вызывает деструктор. Этот прием позволяет избегать ошибок, возникающих при обращении к несуществующему объекту.

35. Основные операторы языка с.

Бинарными (т. е. с двумя операндами) арифметическими операторами являются +, -, *, /, а также оператор деления по модулю %. Деление целых сопровождается отбрасыванием дробной части, какой бы она ни была. Выражение x % y дает остаток от деления x на y и, следовательно, нуль, если x делится на y нацело.

Например, год является високосным, если он делится на 4, но не делится на 100. Кроме

того, год является високосным, если он делится на 400. Следовательно,

if ((year % 4 == 0 && year % 100 !=0 || year % 400 == 0)

printf("%d високосный год\n", year);

else

printf("%d невисокосный год\n", year);

Операторами отношения являются

>>

=

<<

=

Все они имеют одинаковый приоритет. Сразу за ними идет приоритет операторов сравнения на равенство:

==

!=

Операторы отношения имеют более низкий приоритет, чем арифметические, поэтому выражение вроде i < lim-1 будет выполняться так же, как i < (lim-1), т.е. как мы и ожидаем. Более интересны логические операторы && и ||. Выражения, между которыми стоят операторы && или ||, вычисляются слева направо. Вычисление прекращается, как только становится известна истинность или ложность результата.

Приоритет оператора && выше, чем таковой оператора ||, однако их приоритеты ниже,

чем приоритет операторов отношения и равенства. Из сказанного следует, что выражение

вида

i < lim-1 && (с = getchar()) != '\n' && с != EOF

не нуждается в дополнительных скобках. Но, так как приоритет != выше, чем приоритет

присваивания, в

(с = getchar()) != '\n'

скобки необходимы, чтобы сначала выполнить присваивание, а затем сравнение с '\n'. По определению численным результатом вычисления выражения отношения или логического выражения является 1, если оно истинно, и 0, если оно ложно. Унарный оператор ! преобразует ненулевой операнд в 0, а нуль в 1. Обычно оператор ! используют в конструкциях вида

if (!valid)

что эквивалентно

if (valid == 0)

Унарные операторы:

С++/ C--/ ++C/ --C

С=A++/A--

C=++A/--A

C+=A / C -=A / C*=A / C%=A