
- •Конструкторы и перегрузка операций
- •Введение
- •Лабораторная работа № 1. Конструкторы
- •Выполнение лабораторной работы
- •Методические указания к выполнению лабораторной работы
- •Int hours, minutes, seconds; // закрытые поля
- •Int getDigitByPosition(int pos); // возврат цифры числа по позиции
- •Int transferTo10(); // перевод в десятичную систему счисления
- •Void transferFrom10(int numb); // перевод из десятичной системы счисления
- •Int p_number_class::getDigitByPosition(int pos) {
- •Int p_number_class::transferTo10() {
- •Void p_number_class::transferFrom10(int numb) {
- •Int main(int argc, char* argv[])
- •Лабораторная работа № 2. Перегрузка операций
- •Выполнение лабораторной работы
- •Методические указания к выполнению лабораторной работы
- •Void print(const Week &d) // вывод на экран названий дней недели
- •Int denum; // поля - открыты
- •Void reduce(); // метод - открыт
- •Int getDigitByPosition(int pos); // возврат цифры числа по позиции
- •Int transferTo10(); // перевод в десятичную систему счисления
- •Void transferFrom10(int numb); // перевод из десятичной системы счисления
- •Int p_number_class::getDigitByPosition(int pos) {
- •Int p_number_class::transferTo10() {
- •Void p_number_class::transferFrom10(int numb) {
- •Int main(int argc, char* argv[])
- •Библиографический список
Int hours, minutes, seconds; // закрытые поля
};
// реализация вне класса
time::time(): hours(0), minutes(0), seconds(0)
{}
Конструктор инициализации обеспечивает объявление и инициализацию переменных:
time (12,59,59), s(13,45), u = 14;
Конструктор инициализации может вызываться явно:
time R = time(10): // явный вызов конструктора
Конструктор инициализации со всеми аргументами по умолчанию играет роль конструктора без аргументов (конструктора по умолчанию). Конструкторы вызываются и при создании динамических переменных.
time *a = new time; // конструктор без аргументов
time *b = new time(); // конструктор без аргументов
time *d = new time(12,23); // конструктор инициализации
time *f = new time(*d); // конструктор копирования
Конструкторы обеспечивают привычную форму объявления констант:
const time d2(100,67); // конструктор инициализации
const time d0 = 100; // конструктор инициализации
const time d5 = time(l00); // явный вызов
Конструктор инициализации обеспечивает инициализацию массива:
time Т[3] = { 1,2,3 };
Для каждого целого числа, представленного в списке, вызывается конструктор инициализации, поэтому инициализация массива представляет собой следующее:
time T[0]=time(l);
time T[l]=time(2);
time T[2]=time(3);
Если массив не инициализируется, то для каждого элемента массива вызывается конструктор без аргументов, если он определен явно или неявно (или вызывается конструктор инициализации с аргументами по умолчанию).
Деструктор – это метод, имеющий имя класса, с тем отличием, что его первым символом должен быть символ ~ (тильда). Деструктор не возвращает результата и не имеет аргументов. Деструктор в классе может быть только один – перегрузка деструкторов запрещена. Деструктор вызывается автоматически при каждом уничтожении объекта. При отсутствии в классе явно определенного деструктора он создается автоматически. Вид автоматически создаваемого деструктора следующий:
класс::~класс(){}
Если конструкторы класса не запрашивают ресурсов, которые нужно возвращать (например, динамическую память), или не выполняют инициализирующих действий, которые при уничтожении объекта требуют завершающих действий (например, если файл открывается, его нужно закрывать), то деструктор можно не писать.
Конструкторы и параметры
Конструктор копирования вызывается неявным образом при передаче в функцию параметра-объекта по значению и при возврате значения из функции. При других способах передачи параметра конструктор копирования не вызывается.
class Money {
public:
// конструктор инициализации без аргументов
Money(const double &r = 0.0) : Summa(r) {}
friend bool operator==Cconst Money &a, const Money &b);
friend bool operator!=(const Money &a, const Money &b);
private:
double Summa;
};
// реализация дружественных функций
bool operator==(const Money &a, const Money &b) {
return (a.Summa == b.Summa);
}
bool operator!=(const Money &a, const Money &b) {
return !(a == b);
}
// использование
void fl(Money t); // по значению
void f2(Money *t); // no адресу
void f3(const Money &t); // no константной ссылке
void f4(Money &t); // по ссылке
Money d2(100.67); // инициализация
fl(d2); // по значению вызов конструктора копирования
f2(&d2); // по адресу конструкторы не вызываются
f3(d2); // по константной ссылке - не вызываются
f4(d2); // по ссылке - не вызываются
Конструктор копирования вызывается для создания скрытой «внутренней» копии объекта. При передаче в качестве параметра выражения может вызываться конструктор инициализации.
f1(120): // по значению - вызывается конструктор инициализации
f3(120); // по константной ссылке - вызывается конструктор инициализации
Конструкторы позволяют более естественным образом задавать значения параметров по умолчанию.
void f1(Моnеу t = 100);
void f3(const Money &t = 200);
void f2(Money *t = new Money);
void f2(Money *t = new Мопеу(300));
Вызов функций без аргумента во всех случаях сопровождается вызовом конструктора инициализации.
В описание класса добавляем конструкторы:
class P_number_class {
char number[200]; // число
unsigned int scale_of_notation; // система счисления