Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Встраиваемые функции inline

Читайте также:
  1. II. Основные задачи и функции
  2. II. Признаки, ресурсы и функции власти.
  3. II. Функции
  4. II.Синдром дисфункции синусового узла (СССУ) I 49.5
  5. III. Органы, объединяющие эндокринные и неэндокринные функции
  6. III. Функции политологии. Возрастание роли политических знаний в жизни общества.
  7. III. Функции Совета

Реализация программы как набора функций удобна с точки зрения разработ­ки программного обеспечения, но вызовы функций приводят к загруженности во время выполнения. В C++ для снижения расходов ресурсов на вызо­вы функций (особенно небольших функций) предусмотрены встраиваемые (inline) функции. Спецификация inline перед указанием типа результата в объяв­лении функции предписывает компилятору сгенерировать копию кода функции в со­ответствующем месте вызова, чтобы избежать вызова этой функции. Это эквивалентно объявлению соответствующего макроса (директива define сопоставляет символическое имя какой-либо операции). В результате получает­ся множество копий кода функции, вставленных в программу, вместо единствен­ной копии, которой передается управление при каждом вызове функции.

Компилятор может по своему усмотрению игнорировать спецификацию inline, что он делает для всех функций, кроме самых небольших.

Спецификацию inline целесообразно применять только для небольших и часто используемых функций. Использование функций inline может уменьшить время выполнения программы, но при этом может увеличить ее размер. В целом, приме­нение функций inline предпочтительнее объявления макросов, поскольку в дан­ном случае имеется возможность компилятору оптимизировать код.

При использовании функции inline надо учитывать, что внесение в нее ка­ких-то изменений может потребовать перекомпиляции всех «потребителей» этой функции — всех модулей, в которых она вызывается. Это может оказаться сущест­венным моментом для развития и поддержки некоторых больших программ.

Пусть, например, вам во многих частях программы приходится вычислять длину окружности, заданной своим радиусом R. Тогда можно оформить эти вычисления, определив встраи­ваемую функцию:

inline double Circ(double R){return 6.28318 * R;}

Обращение в любом месте программы вида Circ(2) приведет к встраиванию в соответствующем месте кода "6.28318 * 2" (если компилятор сочтет это целесооб­разным).

 

3.3. Введение в наследование.

Наследование - это механизм, посредством которого один класс (производный) может наследовать свойства и методы другого класса (базового).

Базовый класс определяет все качества, которые являются общими для всех производных классов.

//Базовый класс

class B

{

int i;

public:

void set_i(int n);

int get_i();

};

//Производный класс D

class D: public B

{

int j;

public:

void set_j(int n);

int mul();

};

 

После имени класса D стоит двоеточие, за которым стоит ключевое слово public и имя класса B. Это означает, что класс D будет наследовать все компоненты класса B. Само ключевое слово public информирует компилятор о том, что т.к. B будет наследоваться, то все открытые элементы базового класса будут открытыми элементами производного класса. Однако все закрытые элементы базового класса остаются закрытыми.

// Простой пример наследования.

#include <iostream.h>

// Задание базового класса

class base {

int i;

public:

void set_i(int n);

int get_i();

};

// Задание производного класса

class derived: public base {

int j;

public:

void set_j(int n);

int mul();

};

 

// Установка значения i в базовом классе

void base::set_i(int n)

{

i = n;

}

 

// Возврат значения i в базовом классе

int base::get_i()

{

return i;

}

 

// Установка значения j в производном классе

void derived::set_j(int n)

{

j = n;

}

 

// Возврат значения i из base и, одновременно, j из derived

int derived::mul()

{

// производный класс может вызывать функции-члены базового класса

return j * get_i();

}

 

main()

{

derived ob;

 

ob.set_i(10); // загрузка i в base

ob.set_j(4); // загрузка j в derived

 

cout << ob.mul(); // вывод числа 40

 

return 0;

}

Важно! При определении mul() вызывается функция get_i()- базового класса base, а не производного derived, что указывает на то, что открытые члены базового класса становятся открытыми членами производного. Но в функции mul() вместо прямого доступа к i, необходимо вызывать get_i(), потому что закрытые члены базового класса(i) остаются закрытыми для производных классов. Дополнительным вариантом является использование описания данных класса как protected.


Дата добавления: 2015-07-07; просмотров: 175 | Нарушение авторских прав


Читайте в этой же книге: Средства реализации программного кода | Лекция 2. История развития ООП и сред RAD | Отличия ООП от процедурных программ | Пример для освежения в памяти | Лекция №5 Данные-элементы, статические данные, константные данные | Первый пример |
<== предыдущая страница | следующая страница ==>
Функции-элементы, дружественные функции, константные функции| Виртуальные функции.

mybiblioteka.su - 2015-2024 год. (0.009 сек.)