Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Реализация программы как набора функций удобна с точки зрения разработ­ки программного обеспечения, но вызовы функций приводят к загруженности во время выполнения. В 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.




Поделиться с друзьями:


Дата добавления: 2014-01-13; Просмотров: 367; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.017 сек.