ИСХОДНЫЕ ТЕКСТЫ ПРИМЕРОВ
Операции и дружественные операции
Последняя программа использовала функции-элементы и дружественную функцию, которые реализовали действия, выполняемые в стандартных типах с помощью операций вроде = и +. Подход типичен для языков C и Pascal, потому что эти языки не поддерживают определяемые пользователем операции. В отличии от них C++ позволяет вам объявлять операции и дружественные операции. Эти операции включают в себя: +, -, *, /, %, ==, !=, <=, <, >=, >, +=, -=,
*=, /=, %=, [], (), << и >>. Обратитесь к описанию языка C++, где обсуждаются детали определения этих операций. СИ трактует операции и дружественные операции как специальный тип функций-элементов и дружественных функций. Общий синтаксис для объявления операций и дружественных операций:
class className
{
public:
// конструкторы и деструктор
// функции-элементы
// унарная операция
returnType operator operatorSymbol();
// бинарная операция
returnType operator operatorSymbol(operand);
// унарная дружественная операция
friend returnType operator operatorSymbol(operand);
// бинарная дружественная операция
friend returnType operator operatorSymbol(firstOperand, secondOperand); };
Пример 10:
class String
{
protected:
char *str;
int num; public:
String();
~String();
// другие функции-элементы
// операция присваивания
String& operator =(String& s);
String& operator +=(String& s);
// операции конкатенации
friend String& operator +(String& s1, String& s2);
friend String& operator +(const char* s1, String& s2);
friend String& operator +(String& s1, const char* s2);
// операции отношения
friend int operator >(String& s1, String& s2);
friend int operator =>(String& s1, String& s2);
friend int operator <(String& sl, String& s2);
friend int operator <=(String& sl, String& s2);
friend int operator ==(String& s1, String& s2);
friend int operator !=(String& sl, String& s2); };
Код, который вы пишете, будет использовать операции и дружественные операции точно так же, как и предопределенные операции. Следовательно, вы можете создавать операции, чтобы поддерживать действия над классами, моделирующими, например, комплексные числа, строки, векторы и матрицы.
Эти операции дают возможность вам записывать выражения в более привычной форме, чем использование вызовов функций.
(Листинг 8.1. исходный текст программы RECT.CPP
// Программа C++, иллюстрирующая использование класса.
// Программа моделирует прямоугольник.)
// Листинг 8.2. Исходный текст программы ARRAY.CPP
// Программа демонстрируюет использование конструкторов и деструкторов:
// - создает динамический массив (объект),
// - присваивает значения элементам динамического массива,
// - выводит значения элементов динамического массива,
// - удаляет динамический массив.
// Листинг 8.3. Исходный текст программы CIRCLE.CPP // Простой пример иерархии классов.
// Листинг 8.4. Исходный текст программы VIRTUAL.CPP // Программа демонстрирует использование виртуальных функций // для моделирования квадратов и прямоугольников и вывода их // размеров и площади