Лабораторная работа Конструкторы и деструкторы Цель работы
Скачать 472.75 Kb.
|
Лабораторная работа 4. Конструкторы и деструкторы 1. Цель работы Изучить возможность инициализации объектов класса с помощью конструкторов и уничтожение их с помощью деструкторов. 2. Краткие теоретические сведения При создании объектов одной из наиболее широко используемых операций является инициализация элементов данных объекта. Единственным способом, с помощью которого вы можете обратиться к частным элементам данных, является использование функций класса. Чтобы упростить процесс инициализации элементов данных класса, C++ использует специальную функцию, называемую конструктором, которая запускается для каждого создаваемого вами объекта. Подобным образом C++ обеспечивает функцию, называемую деструктором, которая запускается при уничтожении объекта. Основными концепциями конструктора и деструктора являются: Конструктор представляет собой метод класса, который облегчает инициализацию элементов данных класса. Конструктор имеет такое же имя, как и класс. Конструктор не имеет возвращаемого значения. Каждый раз, когда программа создает переменную класса, C++ вызывает конструктор класса, если конструктор существует. Многие объекты могут распределять память для хранения информации; когда вы уничтожаете такой объект, C++ будет вызывать специальный деструктор, который может освобождать эту память, очищая ее после объекта. Деструктор имеет такое же имя, как и класс, за исключением того, что вы должны предварять его имя символом тильды (). Деструктор не имеет возвращаемого значения. Представьте конструктор как функцию, которая помогает строить (конструировать) объект. Подобно этому, деструктор представляет собой функцию, которая помогает уничтожать объект. Деструктор обычно используется, если при уничтожении объекта нужно освободить память, которую занимал объект. Создание простого конструктора Конструктор представляет собой метод класса, который имеет такое же имя, как и класс. Например, если вы используете класс с именем employee , конструктор также будет иметь имя employee . Конструктор не возвращает никакого значения, несмотря на то, что он не объявляется как void class employee { public: employee(char *, long, float); // Конструктор void show_employee(void); int change_salary(float); long get_id(void); } Перегрузка конструкторов C++ позволяет вашим программам перегружать определения функций, указывая альтернативные функции для других типов параметров. C++ позволяет вам также перегружать конструкторы. Следующая программа перегружает конструктор employee Первый конструктор требует, чтобы программа указывала имя служащего, номер служащего и оклад. Второй конструктор запрашивает пользователя ввести требуемый оклад, если программа не указывает его: #include #include { public: employee(char *, long, float); employee(char *, long); void show_employee(void); int change_salary(float) ; long get_id(void); private: char name [64]; long employee_id; float salary; }; employee::employee(char *name, long employee_id, float salary) { strcpy(employee::name, name); employee::employee_id = employee_id; if (salary < 50000.0) employee::salary = salary; else // Недопустимый оклад employee::salary = 0.0; } employee::employee(char *name, long employee_id) { strcpy(employee::name, name); employee::employee_id = employee_id; do { cout << "Введите оклад для " << name << " меньше $50000: " ; cin >> employee::salary; } Что нужно знать? Конструкторы и деструкторы представляют собой специальные функции класса, которые программа автоматически вызывает при создании или уничтожении объекта. Большинство программ используют конструктор для инициализации элементов данных класса. Основные концепции: Конструктор представляет собой специальную функцию, которую ваша программа автоматически вызывает каждый раз при создании объекта. Конструктор имеет такое же имя, как и класс объекта. Конструктор не имеет возвращаемого значения, но вы не указываете ему тип void. Вместо этого вы просто не указываете возвращаемое значение вообще. Когда ваша программа создает объект, она может передать параметры конструктору во время объявления объекта. C++ позволяет вам перегружать конструкторы и разрешает использовать значения по умолчанию для параметров. Деструктор представляет собой специальную функцию, которую ваша программа вызывает автоматически каждый раз при уничтожении объекта. Деструктор имеет такое же имя, как и класс объекта, но его имя предваряется символом тильды () 3. Индивидуальное задание (5 баллов) Пользовательский класс MyString должен содержать необходимые элементы- данные, которые создаются в динамической области памяти. Конструкторы (без параметров, с параметрами, копирования) для создания строк: MyString (…); Деструктор: MyString(); Метод ввода исходной строки: set(); Метод изменения исходной строки согласно варианту (исходная и измененная строка должны сохраняться в файле): update() ; Метод вывода на экран: print(…); Каждый вызов методов (в том числе конструкторов и деструктора) сопровождается выдачей соответствующего сообщения; Код методов – вне пространства определения класса. Написать демонстрационную программу, в которой показать использование объектов созданного класса Варианты: 1. Длина L нечетная, то удаляется символ, стоящий посередине строки; 2. Длина L четная, то удаляются 2 первых и 2 последних символа; 3. Длина L кратна 2-м, то удаляются все цифры, которые делятся на 2; 4. Длина L кратна 3-м, то удаляются все цифры, делящиеся на 3; 5. Длина L >10, то удаляются все цифры; 6. Длина L >15, то удаляются все a..z; 7. Длина L=10, то удаляются все A..Z; 8. Длина L кратна 4-м, то первая часть строки меняется местами со второй; 9. Длина L кратна 5-и, то подсчитывается количество скобок всех видов; 10. Длина L >5-и, то выделяется подстрока до первого пробела; 11. Длина L >6-и, то выделяется подстрока { } скобках; 12. Длина L >10-и, то удаляется подстрока в [] скобках; 13. Длина L >12-и, то удаляется подстрока до первой ( скобки; 14. Длина L кратна 4-м, то выделяется подстрока после последнего пробела; 15. Длина L >5, то удаляются все точки. 16. Длина L четная, то выделяется подстрока до первого пробела 17. Длина L четная, то удаляется подстрока до первого пробела 18. Длина L четная, то выделяется подстрока со второго пробела 19. Длина L нечетная, то выделяется подстрока после первого пробела 20. Длина L нечетная, то удаляется подстрока со второго пробела 21. Длина L кратна 3, то удаляется каждый 3-й символ 22. Длина L четная, то удаляется каждый 2-й символ 23. Длина L нечетная, то 24. Длина L четная, то выделяется подстрока до последнего пробела 25. Длина L нечетная, то выделяется подстрока от последней цифры 4. Контрольные вопросы 1. Что такое конструктор 2. Как задается имя конструктора? 3. Может ли класс иметь более одного конструктора? 4. Что такое деструктор? 5. В чем состоит преимущество определения конструктора со списком инициализации элементов? 6. Какие виды конструкторов создаются по умолчанию? 7. В каком порядке инициализируются поля в классе? 8. Какая ошибка в следующей реализации конструктора? 9. Может ли деструктор иметь аргументы? 10. Какая ошибка в следующей реализации деструктора? |
}; employee::employee(char *name, long employee_id, float salary)
{ strcpy(employee::name, name) ; employee::employee_id = employee_id; if (salary < 50000.0) employee::salary = salary; else //
Недопустимый оклад employee::salary = 0.0;
} void main(void)
{ employee worker("Happy Jamsa", 101, 10101.0); worker.show_employee();
}
Обратите внимание, что за объявлением объекта worker следуют круглые скобки и начальные значения, как и при вызове функции. Когда вы используете конструктор с параметрами, передавайте ему параметры при объявлении объекта: employee worker("Happy Jamsa", 101, 10101.0);
Конструкторы и параметры по умолчанию
C++ позволяет указывать значения по умолчанию для параметров функции. Если пользователь не указывает каких-либо параметров, функция будет использовать значения по умолчанию. Конструктор не является исключением. Например, следующий конструктор employee использует по умолчанию значение оклада равным 10000.0, если программа не указывает оклад при создании объекта. Однако программа должна указать имя служащего и его номер: employee::employee(char *name, long employee_id, float salary = 10000.00)
{ strcpy(employee::name, name); employee::employee_id = employee_id; if (salary < 50000.0) employee::salary = salary; else //
Недопустимый оклад employee::salary = 0.0;
} void employee::show_employee(void)
{ cout << "
Служащий
: " << name << endl; cout << "
Номер служащего
: " << employee_id << endl; cout << "
Оклад
: " << salary << endl;
} void main(void)
{ employee worker("Happy Jamsa", 101, 10101.0); employee manager("Jane Doe", 102); worker.show_employee(); manager.show_employee();
}
Если вы откомпилируете и запустите эту программу, на вашем экране появится запрос ввести оклад для Jane Doe. Когда вы введете оклад, программа отобразит информацию об обоих служащих.
Представление о деструкторе
Деструктор автоматически запускается каждый раз, когда программа уничтожает объект.
При завершении программ C++ уничтожает объекты. Если определен деструктор, C++ будет автоматически вызывать деструктор для каждого объекта, когда программа завершается (т.е. когда объекты уничтожаются). Подобно конструктору, деструктор имеет такое же имя, как и класс объекта. Однако в случае деструктора его имя предваряется символом тильды (), как показано ниже:
class_name (void) //-----------
>указывает деструктор
{
// Операторы деструктора
}
В отличие от конструктора деструктору параметры не передаются. Деструктор для класса employee: void employee::-employee(void)
{ cout << "
Уничтожение объекта для " << name << endl;
}
В данном случае деструктор просто выводит на ваш экран сообщение о том, что C++ уничтожает объект. Программа автоматически вызывает деструктор, без какого-либо явного вызова функции деструктора.