Язык программирования C++ |
Классы и объекты
Переопределение операций
В языке Си++ можно сделать так, что класс будет практически неотличим от предопределенных встроенных типов при использовании в выражениях. Для класса можно определить операции сложения, умножения и т.д. пользуясь стандартной записью таких операций, т.е. x + y. В языке Си++ считается, что подобная запись - это также вызов метода с именем operator+ того класса, к которому принадлежит переменная x. Перепишем определение класса Complex:
// определение класса комплексных чисел class Complex { public: int real; // вещественная часть int imaginary; // мнимая часть // прибавить комплексное число Complex operator+(const Complex x) const; };
Вместо метода Add появился метод operator+. Изменилось и его определение. Во-первых, этот метод возвращает значение типа Complex ( операция сложения в результате дает новое значение того же типа, что и типы операндов). Во-вторых, перед аргументом метода появилось ключевое слово const. Это слово обозначает, что при выполнении данного метода аргумент изменяться не будет. Также const появилось после объявления метода. Второе ключевое слово const означает, что объект, выполняющий метод, не будет изменен. При выполнении операции сложения x + y над двумя величинами x и y сами эти величины не изменяются. Теперь запишем определение операции сложения:
Complex Complex::operator+(const Complex x) const { Complex result; result.real = real + x.real; result.imaginary = imaginary + x.imaginary; return result; }
Подписи методов и необязательные аргументы
Как и при объявлении функций, язык Си++ допускает определение в одном классе нескольких методов с одним и тем же именем, но разными типами и количеством аргументов. (Определение методов с одинаковыми прототипами в разных классах не вызывает проблем, поскольку пространства имен разных классов не пересекаются).
// определение класса комплексных чисел class Complex { public: int real; // вещественная часть int imaginary; // мнимая часть // прибавить комплексное число Complex operator+(const Complex x) const; // прибавить целое число Complex operator+(long x) const; };
В следующем примере вначале складываются два комплексных числа, и вызывается первая операция +. Затем к комплексному числу прибавляется целое число, и тогда выполняется вторая операция сложения.
Complex c1; Complex c2; long x; c1 + c2; c2 + x;
Аналогично можно задавать значения аргументов методов по умолчанию. Более подробное описание можно найти в лекции 5.
Запись классов
Как уже отмечалось раньше, выбор имен - это не праздный вопрос. Существует множество систем именования классов. Опишем ту, которой мы придерживаемся в данной книге.
Имена классов, их методов и атрибутов составляются из английских слов, описывающих их смысл, при этом если слов несколько, они пишутся слитно. Имена классов начинаются с заглавной буквы; если название состоит из нескольких слов, каждое слово начинается с заглавной буквы, остальные буквы маленькие:
Complex, String, StudentLibrarian
Имена методов классов также начинаются с большой буквы:
Add, Concat
Имена атрибутов класса начинаются с маленькой буквы, однако если имя состоит из нескольких слов, последующие слова начинаются с большой:
real, classElement
При записи определения класса мы придерживаемся той же системы расположения, что и при записи функций. Ключевое слово class и имя класса записываются в первой строке, открывающаяся фигурная скобка - на следующей строке, методы и атрибуты класса - на последующих строках с отступом.