Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцООППССРВ_89.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
673.79 Кб
Скачать

9. Встраиваемые функции-элементы

Если определение функции помещено в описание класса, то такая функция-элемент является встраиваемой.

Для встраиваемой функции компилятор генерирует ее код в точке вызова. Это сокращает время выполнения программы, но увеличивает объем программы.

Если определение функции помещено вне описания класса, то Функция-элемент не является встроенной . Машинный код такой функции транслятором генерируется однократно, а привязка кода к точке вызова (вызывающему объекту) осуществляется с помощью указателя this (передачей адреса) во время выполнения программы (позднее связывание).

Если определение функции-элемента расположено вне класса, то ей можно установить статус встроенной с помощью ключевого слова inline в ее описании в классе, например:

class A

{ public: inline void func();

};

void A::func() {тело функции}

10. Создание экземпляров класса. Конструктор

Экземпляры класса создаются с помощью специальной компонентной функции класса – конструктора.

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

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

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

Явно определенный в классе конструктор может быть с параметрами и без параметров. Определение конструктора имеет вид:

имя_класса( список_параметров ) { тело }

имя_класса() { тело }.

В первом случае значениями параметров в теле конструктора инициализируются элементы-данные класса. Во втором случае инициализация осуществляется значениями, заданными в теле конструктора. Если конструктор генерируется по умолчанию, то инициализация осуществляется нулевыми значениями.

При явном определении конструктора элементы-данные могут инициализироваться двумя способами:

- индивидуальным присвоением значений компонентным данным в теле конструктора;

- использованием списка инициализации данных в заголовке конструктора

Пример:

а) class Time

{ int hr, min;

public: Time (int h) {hr = h; min = 0;} // 1 - й способ

Time (int h, int m): hr(h), min(m){} // 2 – й способ

};

void main(){

Time start1(17);

Time start(17,45);

}

б) class Time { // комбинация двух способов

int min; const int hr;

public:

Time (int h, int m): hr(h) {min = m;}

};

Список инициализации является единственным средством присвоения значений элементам-данным класса, объявленным как const или как ссылки.

Для вызова конструктора используется следующие синтаксические формы:

имя_класса имя_объекта;

имя_класса имя_объекта(аргументы);

имя_класса(аргументы);

Первая форма используется для вызова стандартного конструктора (по умолчанию). Вторая форма используется для конструктора с параметрами. Третья форма используется для создания и инициализации объекта без имени, когда необходимо инициализировать вновь создаваемый объект значениями другого объекта (без имени) с помощью операции присваивания или когда имя объекта не используется в последующем контексте программы. Именно такая форма используется при создании объекта в динамической памяти.

Пример:

myclass ob1;

myclass ob1(4);

myclass ob1 = myclass(4); //автоматически вызывается конструктор копии.