В C# методы внутри одного класса могут иметь одинаковое имя при условии, что их параметры будут разл.. Такую ситуацию наз. перегрузкой методов, а методы – перегруженными. Перегрузка методов – один их способов реализации полиморфизма в C#. Все перегруженные методы должны иметь списки параметров, которые отличаются по типу и/или количеству. Методам для перегрузки недостаточно отличаться лишь типами возвращаемых значений, может произойти автоматическое преобразование типов. Они должны отличаться типами или числом параметров. При вызове перегруженного метода выполняется та его версия, параметры которой совпадают (по типу и /или количеству) с заданными аргументами. Перегрузка методов нужно тогда, когда нужно реализовать один и тот же метод для различных типов данных, чтобы не плодить имена. Перегрузка упрощает процесс программирования. Следует отметить, что params-параметр не является определяющим фактором отличия перегруженного метода от другого (ведь можно и 0 аргументов через params передать). Тип возврата значения и params – это не факторы перегруженного метода. Конструкторы тоже можно перегружать. Это позволяет создавать объекты различными способами. Перегружая констры предоставляет определенную гибкость в выборе способов создания объектов. Одна из распр.причин перегрузки – возм-сть инициализации одного объекта с помощью другого. Конструкторы, в которых создаваемый объект инициализируется объектом-параметром, наз. конструктором копирования. ClassStac { //члены-перем.: //char[] mas; //массив для хранения данных стека int tos; }
Конструктор по умолчанию. Конструктор не имеющий обязательных аргументов. Используется при создании массивов объектов, вызываясь для создания каждого экземпляра. В отсутствие явно заданного конструктора по умолчанию его код генерируется компилятором (что на исходном тексте, естественно, не отражается).
Конструктор копирования. Конструктор, аргументом которого является ссылка на объект того же класса. Применяется в C++ для передачи объектов в функции по значению. Конструктор копирования в основном необходим, когда объект имеет указатели на объекты выделенные в куче. Если программист не создаёт конструктор копирования, то компилятор создаст неявный конструктор копирования, который копирует указатели как есть, то есть фактическое копирование данных не происходит и два объекта ссылаются на одни и те же данные в куче. Соответственно попытка изменения «копии» повредит оригинал, а вызов деструктора для одного из этих объектов при последующем использовании другого приведёт к обращению в область памяти, уже не принадлежащую программе. Аргумент должен передаваться именно по ссылке, а не по значению. Это вытекает из коллизии: при передаче объекта по значению (в частности, для вызова конструктора) требуется скопировать объект. Но для того, чтобы скопировать объект, необходимо вызвать конструктор копирования.
Конструктор преобразования. Конструктор, принимающий один аргумент. Задаёт преобразование типа своего аргумента в тип конструктора. Такое преобразование типа неявно применяется только если оно уникально.
Виртуальный конструктор. Конструктор не бывает виртуальным в смысле виртуального метода — для того, чтобы механизм виртуальных методов работал, нужно запустить конструктор, который автоматически настроит таблицу виртуальных методов данного объекта.
«Виртуальными конструкторами» называют похожий, но другой механизм, присутствующий в некоторых языках — например, он есть в Delphi, но нет в C++ и Java. Этот механизм позволяет создать объект любого заранее неизвестного класса при двух условиях:
- этот класс является потомком некоего наперёд заданного класса.
- на всём пути наследования от базового класса к создаваемому цепочка переопределения не обрывалась.
23. Понятие стека. Класс «Стек из символов», его основные методы.
Стек — динамическая структура данных, представляющая из себя упорядоченный набор элементов, в которой добавление новых элементов и удаление существующих производится с одного конца, называемого вершиной стека. По определению, элементы извлекаются из стека в порядке, обратном их добавлению в эту структуру, т.е. действует принцип "последний пришёл — первый ушёл".
Наиболее наглядным примером организации стека служит детская пирамидка, где добавление и снятие колец осуществляется как раз согласно определению стека.
Стек можно организовать на базе любой структуры данных, где возможно хранение нескольких однотипных элементов и где можно реализовать определение стека: линейный массив, типизированный файл, однонаправленный или двунаправленный список. В нашем случае наиболее подходящим для реализации стека является однонаправленный список, причём в качестве вершины стека выберем начало этого списка.
Выделим типовые операции над стеком и его элементами: 1) добавление элемента в стек; 2) удаление элемента из стека; 3) проверка, пуст ли стек; 4) просмотр элемента в вершине стека без удаления; 5) очистка стека.