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

20. Преобразование и приведение типов.

Часто возникает необх-сть переменной одного типа присвоить значение переменной другого типа. Преобразование между типами данных бывает двух видов: неявное и явное(автоматическое). Неявное преобразование – это преобр-е типов данных, кот. явно не задано и выполняется без спец. указанной команды, т.е такие преобр-я выполняются автомат. Автомат.преобр.будет вып., если: - оба типа совместимы, - тип переменной - приемника больше, чем тип источника. => вып-ся преобр-е с расширением, или расширяющее преобразование. Явное преобр-е – явно заданная инстр-я компилятору преобразовать один тип в другой. Инстр-я зап.так: (тип_приемника) выражение. Еслиприведение приводит к сужающему преобр-ю, то возможна потеря инф-ции. Преобр.типов может встречаться и в выражениях. Преобр. типов вып.на основе правил продвижения по «типовой» лестнице.

21. Обработка исключительных ситуаций.

В языке С# предусмотрена обработка ошибочных ситуаций, связанных с выполнением таких системных действий как ввод/вывод через файлы, делением на 0. За обработку исключений отвечает класс ошибок System.Exseption. Для обработки исключений в соответствующем методе класса или в Main() нужно оформить 2 блока: Блок try { //оператор. Здесь может произойти ошибка! } Блок catch (System.Exsceptionerr) { //операторы. Выполняется перехват ошибок указанного типа } При возникновении ошибки внутри блока try проверяется какой тип ошибок перехватывает блок catsh. Для одного блока try можно указать несколько различных блоков catch перехватывающих разные типы ошибок. Если тип ошибок, указанный в блоке catch, не соотв.типу возникшей ошибки, программа прерывается аварийно. Объектная переменная err имеет несколько полезных св-в, которые доступны в приложении: Uessage – содержит текст ошибки; targetSite – создает имя метода, вызвавшего ошибку; Sounce – создает имя приложения, вызвавшего ошибку. Иногда блок catch оформляется кратко: catch(Exsceptionerr) { C.Wr.(err.Message); C.RL(); }

22. Перегрузка методов и перегрузка конструкторовкак механизм реализации полиморфизма. Виды конструкторов.

В C# методы внутри одного класса могут иметь одинаковое имя при условии, что их параметры будут разл.. Такую ситуацию наз. перегрузкой методов, а методы – перегруженными. Перегрузка методов – один их способов реализации полиморфизма в C#. Все перегруженные методы должны иметь списки параметров, которые отличаются по типу и/или количеству. Методам для перегрузки недостаточно отличаться лишь типами возвращаемых значений, может произойти автоматическое преобразование типов. Они должны отличаться типами или числом параметров. При вызове перегруженного метода выполняется та его версия, параметры которой совпадают (по типу и /или количеству) с заданными аргументами. Перегрузка методов нужно тогда, когда нужно реализовать один и тот же метод для различных типов данных, чтобы не плодить имена. Перегрузка упрощает процесс программирования. Следует отметить, что params-параметр не является определяющим фактором отличия перегруженного метода от другого (ведь можно и 0 аргументов через params передать). Тип возврата значения и params – это не факторы перегруженного метода. Конструкторы тоже можно перегружать. Это позволяет создавать объекты различными способами. Перегружая констры предоставляет определенную гибкость в выборе способов создания объектов. Одна из распр.причин перегрузки – возм-сть инициализации одного объекта с помощью другого. Конструкторы, в которых создаваемый объект инициализируется объектом-параметром, наз. конструктором копирования. ClassStac { //члены-перем.: //char[] mas; //массив для хранения данных стека int tos; }

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

Конструктор копирования. Конструктор, аргументом которого является ссылка на объект того же класса. Применяется в C++ для передачи объектов в функции по значению. Конструктор копирования в основном необходим, когда объект имеет указатели на объекты выделенные в куче. Если программист не создаёт конструктор копирования, то компилятор создаст неявный конструктор копирования, который копирует указатели как есть, то есть фактическое копирование данных не происходит и два объекта ссылаются на одни и те же данные в куче. Соответственно попытка изменения «копии» повредит оригинал, а вызов деструктора для одного из этих объектов при последующем использовании другого приведёт к обращению в область памяти, уже не принадлежащую программе. Аргумент должен передаваться именно по ссылке, а не по значению. Это вытекает из коллизии: при передаче объекта по значению (в частности, для вызова конструктора) требуется скопировать объект. Но для того, чтобы скопировать объект, необходимо вызвать конструктор копирования.

Конструктор преобразования. Конструктор, принимающий один аргумент. Задаёт преобразование типа своего аргумента в тип конструктора. Такое преобразование типа неявно применяется только если оно уникально.

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

«Виртуальными конструкторами» называют похожий, но другой механизм, присутствующий в некоторых языках — например, он есть в Delphi, но нет в C++ и Java. Этот механизм позволяет создать объект любого заранее неизвестного класса при двух условиях:

- этот класс является потомком некоего наперёд заданного класса.

- на всём пути наследования от базового класса к создаваемому цепочка переопределения не обрывалась.