Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

4.2.5. Типы функций-членов класса

Поведение описывается набором действий, которые можно совершить над объектом или сам объект может совершить. Что происходит: чтение-запись, выполнение любых вычислений, порождение событий или реакция на те или иные события происходящие в моделируемой системе.

Можно выделить следующие группы действий (функций-членов класса):

  • конструктор - операция создания объекта и инициализации его атрибутов

  • деструктор - операция, освобождающая используемые объектом ресурсы и разрушающая его

  • модификатор - операция, которая изменяет состояние объекта (clear, set_ n, set_ d, …)

  • селектор - операция, считывающая состояние объекта, но не меняющая ( get_ n, get_ r1, … )

  • утилита - операция высокого уровня, выполняющая те или иные действия в зависимости от сущности объекта ( Ray Trace, CalcParaxial).

При реализации функций-членов класса, оператор :: показывает принадлежность функции к классу. При реализации всех функций-членов класса к имени функции добавляет <имя класса::>, в нашем случае Lens::. Например:

void Lens::CalculateParaxial()

{

}

4.3 Конструкторы и деструкторы класса

Любой переменной, участвующей в работе программы, требуется память и некоторое начальное значение. Для переменных встроенных типов размещение в памяти обеспечивается компилятором. Для локальных переменных память выделяется из стека программы и занимается для хранения значения данной переменной до тех, пока не закончится время ее жизни. Сложные типы данных также должны размещаться в памяти и уничтожаться когда их время жизни закончилось. Это осуществляется с использованием конструкторов и деструкторов.

Конструктор (constructor) - это функция-член, имя которой совпадает с именем класса, инициализирующая переменные-члены, распределяющая память для их хранения (new).

// конструктор по умолчанию

Lens();

// полный конструктор

Lens(double r1, double r2, double D, double d, double n);

// конструктор копирования

Lens(const Lens& one);

Деструктор (destructor) - это функция-член, имя которой представляет собой ~имя класса, предназначенная для уничтожения переменных (delete).

~Lens(); // деструктор

Одной из особенностей конструктора и деструктора является то, что в отличие от всех остальных функций, у них нет возвращаемого значения.

4.3.1. Конструкторы

Конструктор по умолчанию

Конструктор, не требующий аргументов, называется конструктором по умолчанию. Конструктор по умолчанию не имеет аргументов и инициализирует все переменные члены какими-либо начальными значениями.

// описание конструктора по умолчанию

Lens();

// реализация конструктора по умолчанию

Lens::Lens()

{

m_R1=0.;

m_R2=0.;

m_d=0.;

m_D=0.;

m_n=1.;

}

При создании любого экземпляра класса вызывается конструктор. Если при описании экземпляра не указываются никакие параметры – вызывается конструктор по умолчанию:

// вызов конструктора по умолчанию

Lens test_lens1;

Lens test_lens2();

Lens test_lens3[10][10];

Полный конструктор

Полный конструктор позволяет явно инициализировать все переменные-члены класса.

// описание полного конструктора

Lens(double r1,double r2,double D, double d, double n);

// реализация полного конструктора

Lens::Lens(double r1, double r2, double D, double d, double n)

{

m_R1=r1;

m_R2=r2;

m_d=d;

m_D=D;

m_n=n;

}

Если при описании экземпляра класса в скобках указать параметры, при создании экземпляра класса будет вызван полный конструктор и переменные-члены инициализируются указанными значениями.

// вызов полного конструктора

Lens test_lens(10., -10., 2., 5., 1.5);

Неполный конструктор

Возможен и неполный конструктор, когда в списке параметров указываются не все возможные параметры для инициализации членов класса, а только наиболее часто используемые. Остальные параметры будут инициализированы значениями по умолчанию.

// описание неполного конструктора

Lens(double r1, double r2);

// реализация неполного конструктора

Lens::Lens(double r1, double r2)

{

m_R1=r1;

m_R2=r2;

m_d=0.;

m_D=0.;

m_n=1.;

}

// вызов неполного конструктора

Lens lens(10., -10.);

Инициализация переменных-членов класса в конструкторах может осуществляться не только в теле конструктора, но и после оператора :. При этом, во время присваивания переменной-члену значения, будет вызываться не оператор присваивания, а конструктор. Для встроенных типов данных, таких как double или int, это не существенно, но если членами класса являются абстрактные типы, вызов конструктора вместо оператора присваивания будет выполняться быстрее.

Lens::Lens(double r1, double r2)

: m_R1(R1)

, m_R2(R2)

{

m_d=2.;

m_D=5.;

m_n=1.5;

}

или такой вариант:

Lens::Lens(double R1, double R2)

: m_R1(R1)

, m_R2(R2)

, m_d(2.)

, m_D(5.)

, m_n(1.5)

{

}

Конструктор копирования

Конструктор копирования создает копию уже существующего экземпляра класса, копируя поэлементно переменные-члены. Конструктор копирования также используется при передаче экземпляров класса в функции по значению. Обратите внимание, что экземпляр класса передается в конструктор по константной ссылке.

// описание конструктора копирования

Lens(const Lens& l);

// реализация конструктора копирования

Lens::Lens(const Lens& l)

: m_R1(l.m_R1)

, m_R2(l.m_R2)

, m_d(l.m_d)

, m_D(l.m_D)

, m_n(l.m_n)

{

}

// вызов конструктора копирования

Lens lens1(10., -10.);

Lens lens2(lens1);