- •Конструкторы и перегрузка операций
- •Введение
- •Лабораторная работа № 1. Конструкторы
- •Выполнение лабораторной работы
- •Методические указания к выполнению лабораторной работы
- •Int hours, minutes, seconds; // закрытые поля
- •Int getDigitByPosition(int pos); // возврат цифры числа по позиции
- •Int transferTo10(); // перевод в десятичную систему счисления
- •Void transferFrom10(int numb); // перевод из десятичной системы счисления
- •Int p_number_class::getDigitByPosition(int pos) {
- •Int p_number_class::transferTo10() {
- •Void p_number_class::transferFrom10(int numb) {
- •Int main(int argc, char* argv[])
- •Лабораторная работа № 2. Перегрузка операций
- •Выполнение лабораторной работы
- •Методические указания к выполнению лабораторной работы
- •Void print(const Week &d) // вывод на экран названий дней недели
- •Int denum; // поля - открыты
- •Void reduce(); // метод - открыт
- •Int getDigitByPosition(int pos); // возврат цифры числа по позиции
- •Int transferTo10(); // перевод в десятичную систему счисления
- •Void transferFrom10(int numb); // перевод из десятичной системы счисления
- •Int p_number_class::getDigitByPosition(int pos) {
- •Int p_number_class::transferTo10() {
- •Void p_number_class::transferFrom10(int numb) {
- •Int main(int argc, char* argv[])
- •Библиографический список
Выполнение лабораторной работы
Для выполнения работы необходимо:
формализовать задачу;
составить описание класса;
составить алгоритм для каждого метода, описанного в классе, и определить все методы;
создать объекты описанного типа;
разработать набор тестов, на которых будет проверяться программа;
продемонстрировать работу программы на наборе тестов;
оформить работу и отчитаться по ней.
Методические указания к выполнению лабораторной работы
Задание
Реализовать класс натуральное число в Р-ичной системе счисления (2 < Р < 9). Класс должен содержать методы:
конструктор без аргументов, конструктор инициализации и конструктор по умолчанию.
И перегружать операции:
сложение; вычитание; умножение; деление;
отношения (равно, не равно, больше, меньше).
Выполнение
Перегрузка операций не является обязательной в объектно-ориентированном программировании. Однако наличие перегрузки операций в C++ обеспечивает дополнительный уровень удобства при использовании новых типов данных.
При перегрузке операции нужно учитывать следующие ограничения.
1. Запрещена перегрузка следующих операций:
- sizeof() – определение размера аргумента;
- . (точка) – селектор компонента объекта;
- ?: – условная операция;
- :: – указание области видимости;
- * – выбор компонента класса через указатель;
- # и ## – операции препроцессора.
2. Операции можно перегружать только для нового типа данных – нельзя перегрузить операцию для встроенного типа.
3. Нельзя изменить приоритет перегружаемой операции и количество операндов. Унарная операция обязана иметь один операнд, бинарная – два операнда; не разрешается использовать параметры по умолчанию. Единственная операция, которая не имеет фиксированного количества операндов, – это операция вызова функции (). Операции «+», «–», «*», «&» допускается перегружать и как унарные, и как бинарные.
4. Операции можно перегружать либо как независимые внешние функции (только такой способ перегрузки допустим для enum), либо как методы класса.
Четыре операции:
- присваивания =;
- вызова функции ();
- индексирования [];
- доступа по указателю ->;
допускается перегружать только как методы класса. Эти операции в принципе нельзя перегрузить для конструкции enum.
5. Если операция перегружается как метод класса, то левым (или единственным) аргументом обязательно будет объект класса, для которого перегружается операция.
Прототип функции-операции выглядит следующим образом:
тип operator@(список параметров);
где @ – символ операции. Слово operator является зарезервированным словом и может использоваться только в определении или в функциональной форме вызова операции.
Перегрузка операций внешними функциями
Прототип бинарной операции, перегружаемой как внешняя независимая функция, выглядит так:
тип operator@(параметр1, параметр2);
Для обеспечения коммутативности бинарной операции с параметрами разного типа, как правило, требуется реализовать две функции-операции:
тип operator@(параметр1, параметр2);
тип operator@( параметр2, параметр1);
Хотя бы один из параметров должен быть нового типа. Параметры можно передавать любым допустимым способом. Обращение к операции выполняется двумя способами:
- инфиксная форма параметр1 @ параметр2;
- функциональная форма operator@ (параметр1, параметр2).
Операции инкремента ++ и декремента -- имеют две формы: префиксную и постфиксную. В определении постфиксной формы операции должен быть объявлен дополнительный параметр типа int.
тип operator@( параметр, int);
Этот параметр не должен использоваться в теле функции. Инфиксная форма обращения к такой операции – параметр@; при функциональной форме обращения необходимо задавать второй фиктивный аргумент, например
operator@(параметр,0);
Пример перегрузки операций для перечислимого типа.
// перечислимый тип
enum Week { mon = 1, tue, wed, thu, fri, sat, sun = 0 };
Week operator+(const Week &m, const int &b)
{ Week t = Week(b + m);
return (Week(t%7));
}
// вторая функция для коммутативности сложения
Week operator+(const int &b, const Week &m)
{
return (m+b);
}
Week operator++(Week &m) // префиксная форма
{
return (Week(m+1));
}
Week operator++(Week &m, int) // постфиксная форма
{
Week t = m;
m = Week(m+1);
return t;
}
