Опубликован: 26.06.2003 | Уровень: для всех | Доступ: свободно
Лекция 7:

Классы и объекты

< Лекция 6 || Лекция 7: 12 || Лекция 8 >

Переопределение операций

В языке Си++ можно сделать так, что класс будет практически неотличим от предопределенных встроенных типов при использовании в выражениях. Для класса можно определить операции сложения, умножения и т.д. пользуясь стандартной записью таких операций, т.е. 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 и имя класса записываются в первой строке, открывающаяся фигурная скобка - на следующей строке, методы и атрибуты класса - на последующих строках с отступом.

< Лекция 6 || Лекция 7: 12 || Лекция 8 >
Андрей Одегов
Андрей Одегов
Язык программирования C++
Елена Шумова
Елена Шумова

Здравствуйте! Я у Вас прошла курс Язык программировая Си++.

Заказала сертификат. Хочу изменить способ оплаты. Как это сделать?