Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы 01-21.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
148.99 Кб
Скачать

17. Перегрузка операций. Функциональное назначение. Способ реализации. Примеры применения.

Перегрузка операций - это средство языка, позволяющее вводить операции над типами, определяемыми пользователем. В PascalABC.NET можно использовать только предопределенные значки операций. Перегрузка операций для типа T, являющегося классом или записью, осуществляется при помощи статической (классовой) функции-метода со специальным именем operator ЗнакОперации. Перегрузка специальных операций +=, -=, *=, /= осуществляется с помощью статической (классовой) процедуры-метода, первый параметр которой передается по ссылке.

Например:

type   Complex = record     re,im: real;     class function operator+(a,b: Complex): Complex;     begin       Result.re := a.re + b.re;       Result.im := a.im + b.im;     end;     class function operator=(a,b: Complex): boolean;     begin       Result := (a.re = b.re) and (a.im = b.im);     end;   end;

Для перегрузки операций действуют следующие правила:

  1. Перегружать можно все операции за исключением @ (взятие адреса), as, is, new. Кроме того, можно перегружать специальные бинарные операции +=, -=, *=, /=, не возвращающие значений.

  2. Перегружать можно только еще не перегруженные операции.

  3. Тип по крайней мере одного операнда должен совпадать с типом класса или записи, внутри которого определена операция.

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

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

  6. Типы интерфейсов не могут быть типами параметров. Причина: типы параметров должны вычисляться на этапе компиляции.

  7. Операции приведения типа задаются статическими функциями, у которых вместо имени используется operator implicit (для неявного приведения типа) или operator explicit (для явного приведения типа).

Например:

type   Complex = record     ...     class function operator implicit(d: real): Complex;     begin       Result.re := d;       Result.im := 0;     end;     class function operator explicit(c: Complex): string;     begin       Result := Format('({0},{1})',c.re,c.im);     end;     class procedure operator+=(var c: Complex; value: Complex);     begin       c.re += value.re;       c.im += value.im;     end;   end;

18. Управление областями видимости членов класса. Функциональное назначение. Способ реализации. Примеры применения.

Область видимости членов класса (то есть область кода, из которой к ним можно обращаться по неквалифицированному имени — без указания имени класса или объекта) не зависит от их области доступа, и всегда совпадает с кодом методов класса.

Члены класса видны (то есть к ним можно обращаться без указании имени класса) исключительно в методах

область же видимости самого класса зависит от пространства имён.

Теперь кратко, кому какой доступ они предоставляют

1.Public – доступ открыт всем, кто видит определение данного класса.

2.Private – доступ открыт самому классу (т.е. функциям-членам данного класса) и друзьям (friend) данного класса, как функциям, так и классам.

3.Protected – доступ открыт классам, производным от данного.

Досупны следующие типы видимости членов:

  1. @private - член доступен только внутри класса;

  2. @protected - член доступен внутри класса и в его потомках;

  3. @public - член доступен всем;

  4. @package - анлогично @public внутри исполняемого образа, и как @private при доступе из вне;

  5. @interface Worker : NSObject

  6. {

  7. char *name;

  8. @private

  9. char *evaluation;

  10. @protected

  11. id job;

  12. float wage;

  13. @public

  14. id boss;

  15. int age;

  16. }

  17. Соответственно

  18. Worker * worker = [[Worker alloc] init];

  19. worker->age = 30; // разрешено

  20. // worker->wage = 60.23; // ошибка на стадии компиляции