Лекции по 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>