Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по Леонову, 5семестр.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
503.3 Кб
Скачать

12 Перегрузка операций

С++ позволяет переопределить действия большинства операций так, чтобы при использовании с объектами конкретного класса они выполняли заданные функции. Можно использовать собственные типы данных так же, как и стандартные. Можно перегружать любые операции в С++. Кроме . .* ?: :: # ## sizeof

Перегрузка осуществляется с помощью методов специального вида(функций операций) и подчиняется определенным правилам:

1.При перегрузке сохраняется количество аргументов и приоритеты операций

2.Для стандартных типов данных переопределять операции нельзя

3.Функции операций не могут иметь аргументов по умолчанию

4.Они наследуются, кроме (=)

5.Они не могут определяться, как static

Функцию операцию можно определить 3-мя способами:

-метод класса

-дружественная функция класса

-обычная функция

(в 2-ух последних случаях функция должна принимать хотя бы один аргумент, имеющий тип класса, указателя или ссылки)

Определяются как

Тип operator операция(стас. параметр)

{тело функции}

Операции постфиксного инкремента и декремента должны иметь первый параметр типа int! Используется, чтобы отличить их от префиксной формы.

Class students{

students operator ++(int)

{

students M(*this); list++;

return M;

}

};

students Dmitriy;

cout<<(Dmitriy++).get_list();

13. Шаблоны функций, макросы, inline-функции.

Независимые концепции д. б. представлены независимо и объединяться только при необходимости. При нарушении этого принципа либо объединяются несвязанные концепции, либо создаются ненужные зависимости. Это не гибкий набор компонент для построения системы. Шаблоны у ф-ий - для преодоления проблемы исп-ия одной и той же inline ф-ии - обеспечивают простой способ введения разного рода общих концепций и простые методы их совместного использования. Получающиеся в результате классы и ф-ии сопоставимы по времени выполнения и требованиям к памяти с написанным вручную специализированным кодом. Шаблон явл. механизмом параметризации определения класса или ф-ии произвольным типом. Код, реализующий шаблон, идентичен для всех типов параметров. Шаблоны поддерживают программ-ие с использованием типов в качестве параметров. Наиболее очевидным применением шаблонов явл-ся определение и использование классов-контейнеров. Сразу же возникает потребность в шаблонах ф-ий. Аргументы шаблонов ф-й: шаблоны имеют большое значение при написании обобщенных алгоритмов, применимых к широкому спектру типов контейнеров. Важно: возможность выведения типа аргументов шаблона ф-ии по типам аргументов при ее вызове. Это возможно, если список аргументов ф-ии однозначно идентифицирует набор аргументов шаблона. При невыполнении этого условия необходимо указать аргумент явно. Макросы: первое правило о макросах: не надо их использовать, если мы не обязаны этого делать. Макросы изменяют текст проги до обработки его компилятором, они создают проблемы для многих инструментов разработки. Макрос можно определить с аргументами: #define MAC(x,y) argument1:x argument2:y. Имена макросов нельзя перегружать, они манипулируют строками символов и мало что знают о синтаксисе С++. Компилятор видит текст только после макроподстановки, поэтому и ошибка в макросе будет замечена после подстановки, а не в месте его определения. Это может привести очень странным сообщениям об ошибках. При работе с макросами, чтобы обезопасить себя, пользуйтесь оператором разрешения области видимости. Inline ф-я: каждая ф-я, вызываемая в проге, д. б. определена (и только один раз). Определение ф-ии явл-я объявлением ф-ии, в кот. присутствует тело ф-ии: Extern void swap (int*, int*); // объявление

Void swap (int* р , int* q) // определение

{ int t = *р; *р = *q; *q = t; }. Типы в определении и объявлениях ф-ии должны совпадать. Однако имена аргументов не явл-ся частью типа и не обязаны совпадать. Бывают ф-ии, имеющие неиспользуемый аргумент. Наличие аргумента, пусть и не используемого, обеспечивает независимость вызывающих прог от этих изменений. Ф-ю можно определить также со спецификатором inline такие ф-ии наз-ся встроенными. Спецификатор inline указывает компилятору, что он должен пытаться каждый раз генерировать в месте вызова кода, соответствующий ф-ии fac() (факториал).