|
||||||||||||||||||
Работа № 4. Класс «Динамическая строка» и перегрузка операцийЗадание к работе Общая постановка. Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в динамической области памяти. · Конструктор для их создания (операция new) и установки их начальных значений: Х(); · деструктор: ~Х(); · friend – функция печати: friend void print(); · функция, решающая поставленную задачу: friend Void Run(). Код методов и функций – вне пространства определения класса.
Варианты заданий Варианты заданий используются из работы №2.
Контрольные вопросы 1. Что такое «конструктор», формат объявления, его особенности? 2. Формат объявления деструктора, его назначение 3. Особенности дружественных функций, доступ к закрытой части класса 4. Каким образом дружественная функция получает доступ к закрытой части класса?
Работа № 4. Класс «Динамическая строка» и перегрузка операций
Теоретические сведения Задание к работе Варианты заданий Контрольные вопросы
Цель работы – изучить методику создания одномерных динамических символьных массивов при помощи конструкторов с захватом динамической памяти и деструкторов для их уничтожения, а так же способа работы со строковыми объектами. Познакомиться с механизмом перегрузки операций.
Теоретические сведения Для представления символьной (текстовой) информации можно использовать символы, символьные переменные и символьные константы. Символьная константа представляется последовательностью символов, заключенной в кавычки: “Начало строки \n”. В С++ нет отдельного типа для строк. Массив символов - это и есть строка. Количества элементов в таком массиве на один элемент больше, чем изображение строки, т. к. в конец строки добавлен ‘\0’ (нулевой байт). Присвоить значение массиву символов с помощью обычного оператора присваивания нельзя. Поместить строку в массив можно либо при вводе, либо с помощью инициализации: char s[] = “ABCDEF”; Для работы со строками существует специальная библиотека string. h. Примеры функций для работы со строками из библиотеки string. h в таблице 2: Таблица 2 - Функции работы со строками
Строки, при передаче в функцию, в качестве фактических параметров могут быть определены либо как одномерные массивы типа char[], либо как указатели типа char*. В отличие от обычных массивов в этом случае нет необходимости явно указывать длину строки. Функции преобразования строки S в число: целое: int atoi(S); длинное целое: long atol(S); действительное: double atof(S); при ошибке возвращает значение 0. Функции преобразования числа V в строку S: целое: itoa(int V, char S, int kod); длинное целое: ltoa(long V, char S, int kod); 2< =kod< =36, для отрицательных чисел kod=10. Перегрузка операций Для перегрузки операции для класса в С++ используется следующий синтаксис: < Тип> operator < операция> (< входные параметры> ) где < Тип > - тип, возвращаемый функцией; operator - ключевое слово; < операция > - перегружаемая операция. В языке С++ имеются следующие ограничения на перегрузку операций: · С++ не различает префиксную и постфиксную формы ++ и - -; · переопределяемая операция должна присутствовать в языке (например, нельзя определить операцию с символом #); · нельзя переопределить операторы, заданные следующими символами. *:: ? ; · переопределённые операции сохраняют свой изначальный приоритет. Наличие в классе конструктора String:: String(String& ) и операторов присваивания позволяет защитить объекты класса от побитового копирования. Пример: Ввести с клавиатуры строку символов. Признак окончания ввода строки - нажатие клавиши " Ввод". Программа должна определить длину введенной строки L и если L< 10 – возвратить строку, которая не содержит заглавных латинских букв. #include < iostream. h> class X{ }; X:: X(){ void X:: Set(char* s){ char* X:: Run(){ /*метод, решающий конкретную задачу, в данном случае - выделение из строки подстроки, не содержащей заглавных латинских букв, если длина исходной строки меньше 10*/ return str_return; char* Run(X & obj){return obj. Run(); }; void print(X & obj){cout< < obj. str< < " " < < obj. str_return< < endl; }; ostream& operator< < (ostream & stream, X & ob) { istream & operator> > (istream & stream, X & ob){ cout< < " Type anything and press \" Enter\": " < < endl; };
|
||||||||||||||||||
|