Основы алгоритмического языка С++

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

°нию класса string.

 

Операции и дружественные операции

 

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

// Программа демонстрирует использование виртуальных функций

// для моделирования квадратов и прямоугольников и вывода их

// размеров и площади

 

 

ВОПРОСЫ И ОТВЕТЫ

 

Что случится, если я объявлю конструктор по умолчанию, конструктор копии и другие конструкторы в защищенной области?

 

Программы, использующие ваш класс, не смогут создавать объекты этого класса. Однако они смогут объявлять классы-потомки с открытыми конструкторами.

 

Могу я задать цепочку вызовов функций-элементов ?

 

Да, можете, только если указанные в цепочке функции-элементы возвращают ссылку на тот же самый класс. Например, если в классе String объявлены следующие функции-элементы:

 

String& upperCase();

String& reverse();

Stringa mapChar(char find, char replace);

 

вы можете написать следующий оператор обработки объекта класса

 

String:

s.upperCase().reverse().mapChar( , +);

 

Что может случиться, если класс полагается на конструктор копии, созданный компилятором, и при этом класс использует указатели в качестве элементов-данных?

 

Эти конструкторы выполняют побитовую копию объекта. Следовательно, соответствующие элементы-указатели в обоих объектах будут ссылаться на те же самые динамические данные. Этот способ создания копии объекта - верный путь к различным неприятностям.

 

Могу ли я создавать массив объектов?

 

Да, можете. Однако соответствующий класс должен иметь заданный по умолчанию конструктор. При создании массива используется ранее упомянутый конструктор.

 

Могу ли я использовать указатель при создании объекта класса?

 

Да, можете, но в этом случае вы должны использовать операции new и delete, чтобы распределять и освобождать память для данного объекта.

Вот пример, использующий класс Complex. Не забудьте, что для обращения к элементам классов или структур используется операция ->, если вы ссылаетесь на них при помощи указателей.

 

Complex *pC;

pC = new Complex;

// операции с объектом, к которому обращаются по указателю pC

delete pC;

 

или

 

Complex *pC = new Complex;

// операции с объектом, к которому обращаются по указателю pC

delete pC;

 

Контрольные вопросы

 

1. Найдите ошибку в следующем объявлении класса:

 

class String {

char *str;

unsigned len;

String ();

String(const String& s);

String(unsigned size, char = );

String(unsigned size);

String& assign(String& s);

~String();

unsigned getLen() const;

char* getString();

// другие функции-элементы

};

 

2. Найдите ошибку в следующем о?/p>