Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures_2.doc
Скачиваний:
28
Добавлен:
15.03.2015
Размер:
511.49 Кб
Скачать

Перегрузка оператров

Перегрузка операторов делает систему встроенных типов языка C++ расширяемой. Это обусловлено тем обстоятельством, что программист может наделять создаваемые им пользовательские типы данных всеми возможностями, которые предусмотрены для встроенных типов. Это обеспечивает аппарат перегрузки операторов.

Перегрузку операторов можно рассматривать как частный случай перегрузки функций.

Рассмотрим ограничения, которые следует учитывать при перегрузке операторов:

  • Перегружать операторы можно только для пользовательских типов; перегружать операторы для встроенных типов недопустимо.

  • Нельзя при перегрузке изменять арность, приоритет и ассоциативность операторов. например, в выражении a*b+cприоритет операторов «*» и «+» не должен зависеть от того к какой категории типов (встроенных или пользовательских) относятся переменныеa,bиc/

  • Нельзя вводить новые операторы, например оператор «^».для возведения в степень.

  • Имеются операторы перегрузка, перегрузка которых не допускается. К ним относятся следующие операторы: операторы доступа «.» и «.*», оператор уточнения области видимости «::» и тернарный оператор «?:».

Остановимся на общих элементах синтаксиса перегрузки операторов.

Имя функции, используемой для перегрузки, имеет специальный формат: operator@. Здесьoperator – зарезервированное слово языкаC++, а@ – перегружаемый оператор.

Пример. Имя функции, используемой для перегрузки оператора присваивания: operator=.

Существуют две разновидности перегружающих функций:

  • Функции – члены класса.

  • Дружественные внешние функции.

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

  • Оператор присваивания,

  • Инкремент и декремент.

С другой стороны операторы ввода (>>) и вывода (<<) следует перегружать с помощью дружественных функций.

Рассмотрим вопрос о том, как компилятор вызывает функции, перегружающие операторы. Этот вопрос следует рассмотреть отдельно для перегрузки с помощью функций – членов класса и дружественных функций.

Обратимся к конкретному программному коду.

class Complex { public: Complex operator+ (const Complex& rhs) //… }; // Код клиента int main() { Complex c1(1, 3), c2(2, 4); Complex c3 = c1 + c2; // . . . }

Строка кода: Complex c3 = c1 + c2; будет выполняться так, как будто она имеет следующий видComplexc3 = c1.operator=(c2).

Предположим теперь, что перегрузка оператора + выполняется с помощью дружественной функции.

class Complex { public: friend Complex operator+(const Complex& lhs, const Complex& rhs);

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

Complex c3 = operator+(const Complex& lhs, const Complex& rhs));

Рассмотрим вопрос о количестве аргументов перегружающей функции. Это вопрос следует рассматривать отдельно для случая, когда перегрузка осуществляется с помощью функции – члена класса и внешней функции.

В первом случае, когда перегрузка выполняется с помощью функции – члена класса количество аргументов перегружающей функции на 1 меньше арности перегружающего оператора, а во втором случае – совпадает с арностью оператора.

Соседние файлы в предмете Программирование