Лекции по C++

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

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

µменты

// унарная операция

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. Найдите ошибку в следующем объявлении класса:

 

class String {

protected:

char *str;

unsigned len;

public:

String();

String(const char* s);

String(const String& s);

String(unsigned size, char = );

String(unsigned size);

~String();

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

 

3. Верно или нет? Следующий оператор, который создает объект s класса String, объявленного ранее, является правильным:

 

s = String("Hello Borland C++");

 

4. Если в программе OPERATOR.CPP вы следующим образом измените объявления объектов, будет ли программа компилироваться без ошибок?

 

String s1 = String("Kevin");

String s2 = String(" Нау");

String s3 = s1;

 

ФАЙЛОВЫЕ ОПЕРАЦИИ ВВОДА/ВЫВОДА

 

Сегодняшний урок посвящен файловым операциям ввода/вывода с исполь?/p>