Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры / ООП(Тимофеев) / ООП-Тимофеев.doc
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
328.19 Кб
Скачать

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

Для их объявления используется ключевое слово inline.

inline double cube (double x)

{ return (x * x * x); }

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

double y = 0.5;

cube (y);

Существует еще одна схема встраивания кода с помощью define.

# define SQR(x) ((x)*(x))

# define cube(x) (SQR(x)*(x))

# define ABS(x) (((x)<0)?-(x):x)

. . .

y = SQR(t+8)- cube (t-8);

cout << sqrt (ABS(y));

Препроцессор раскрывает макросы следующим образом

y = SQR(t+8)-cube(t-8);

y = ((t+8)*(t+8))-(SQR(t-8)*(t-8));

y = ((t+8)*(t+8))-(((t-8)*(t-8))*(t-8));

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

Область видимости и класс памяти.

В базовом языке существуют два основных вида области видимости (области действия): -----локальная область видимости;--------область видимости файла.

Локальная область видимости относится к блоку. Тело функции – пример блока с объявлениями и параметрами функции. В область видимости файла входят имена объявленные вне блоков в данном файле. Эти имена являются внешними (глобальными) и доступными из фрагментов программ других файлов.

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

{int a=2; // а – вне блока

cout<<a<<endl; // печать 2

{ int a=7;

cout<<a<<endl; //печать 7 }

cout<<++a<<endl; //напечатается 3

}

В Си++ область видимости идентификатора начинается сразу после его объявления и продолжается до конца самого внутреннего блока, в котором он объявлен.

// Не конфликтующие локальные переменные

#include <stdio.h> #include <conio.h>

void Pause(void); void Function1(void); void Function2(void);

main()

{ Function1(); return 0;

}

void Pause(void)

{

printf("Press <SpaceBar> to continue..."); while (getch() != ' ') ;

}

void Function1(void);

{

char s[15] = "Philadelphia\n"

printf("\nBegin function #1. s = %s", s);

Pause();

Function2();

printf("\nBack in function #1. s = %s", s);

}

void Function2(void)

{

char s[15] = "San Francisco\n"

printf("Begin function #2. s = %s", s);

Pause();

}

Класс памяти auto

Переменные имеют два атрибута: тип и класс памяти: auto – автоматический

extern – внешний register – регистровый static – статический

volatile – непостоянный для Borland

Переменные, объявленные внутри тела функции, по умолчанию являются автоматическими. Также объявление переменных внутри блоков получают автоматический класс памяти. Поэтому ключевое слово auto используется редко. Для явного указания класса памяти его пишут. Например,

{ auto int a, b, c; auto float f=7.7; }

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

Соседние файлы в папке ООП(Тимофеев)