Читайте также:
|
|
ЛЕКЦИЯ 8
ПЕРЕГРУЗКА ОПЕРАТОРОВ________________________________________________________ 1
Понятие перегрузки операторов______________________________________________________________ 1
Правила перегрузки операторов______________________________________________________________ 1
Перегрузка унарных операторов _____________________________________________________________ 2
Перегрузка оператора присваивания__________________________________________________________ 4
Перегрузка бинарных операторов_____________________________________________________________ 5
Перегрузка операторов Х =___________________________________________________________________ 7
Перегрузка бинарных операторов, использующих объекты двух классов__________________________ 8
Перегрузка операторов инкремента и декремента_______________________________________________ 9
Перегрузка оператора индексирования_______________________________________________________ 11
Перегрузка оператора вызова функции_______________________________________________________ 12
Функции преобразования типа_______________________________________________________________ 13
ПЕРЕГРУЗКА ОПЕРАТОРОВ
Понятие перегрузки операторов
В C++ имеется возможность перегрузки большинства встроенных операторов. Операторы могут быть перегружены глобально или в пределах класса. Перегруженные операторы реализуются как функции с помощью ключевого слова operator. Имя перегруженной функции должно быть operator X, где X - перегруженный оператор. Ключевое слово operator, за которым следует символ оператора, называется именем операторной функции. Операторы, которые можно перегружать, приведены ниже.
Перегружаемые бинарные операторы: |
Другие перегружаемые операторы: |
Неперегружаемые операторы: |
Перегружаемые унарные операторы:
Необходимо отметить что, существуют две версии унарных операторов инкремента и декремента: префиксная и постфиксная.
Например, чтобы перегрузить оператор сложения, нужно определить функцию с именем operator+, а чтобы перегрузить оператор сложения с присваиванием, нужно определить функцию operator+=. Обычно компилятор вызывает эти функции неявно, когда перегруженные операторы встречаются в коде программы. Тем не менее, их можно вызывать и непосредственно. Например: Dot А ('А'), В (’В'), С (’С’); // вызов конструктора
С = А + В; // неявный вызов перегруженного оператора сложения
С = A.operator + (В); // явный вызов перегруженного оператора сложения
Правила перегрузки операторов
Операторная функция перегруженного оператора, за исключением new и delete, должна быть:
> либо нестатической функцией-членом класса;
> либо принимать аргумент типа класса;
> либо принимать аргумент перечислимого типа;
> либо принимать аргумент, который является ссылкой на тип класса;
> либо принимать аргумент, который является ссылкой на перечислимый тип. Кроме того, при перегрузке операторной функции выполняются следующие правила:
> операторная функция не может изменять число аргументов перегружаемого оператора;
> операторная функция не может изменять приоритет перегружаемого оператора;
> операторная функция не может иметь параметров по умолчанию;
> операторные функции =, (), [ ] и -> должны быть нестатическими функциями-членами класса. Операторная функция может быть объявлена как функция-член класса. В этом случае должны быть
выполнены следующие правила:
Объектно-ориентированное программирование
Лекция 8 Перегрузка операторов 2
> операторная функция унарного оператора не должна иметь параметров;
> операторная функция бинарного оператора должна иметь один параметр;
> операторная функция класса наследуются его производными классами (за исключением операторной функции оператора присваивания).
Операторная функция может быть объявлена как глобальная функция, которая имеют дружественный доступ к членам класса. В этом случае должны быть выполнены следующие правила:
> операторная функция унарного оператора должна иметь один параметр;
> операторная функция бинарного оператора должна иметь два параметра.
> операторная функция не наследуются его производными классами (как и любая дружественная функции).
Правила для операторов new и delete будут рассмотрены отдельно.
Заметим, что с помощью перегрузки можно совершенно изменить смысл оператора для некоторого класса. Однако рекомендуется не делать этого без веских на то причин, так как это может сильно затруднить понимание кода программы. Перегруженный оператор, как правило, должен следовать семантике его поведения для встроенных типов данных.
Дата добавления: 2015-11-26; просмотров: 86 | Нарушение авторских прав