Программирование >>  Инициализация объектов класса, структура 

1 ... 120 121 122 [ 123 ] 124 125 126 ... 395


FC представляет собой тип:

С-функция с параметром типа int, не возвращающая никакого значения extern C typedef void FC( int );

f2() - C++ функция с параметром - указателем на С-функцию

void f2( FC *pfParm ); Упражнение 7.21

В разделе 7.5 приводится определение функции factorial() . Напишите объявление указателя на нее. Вызовите функцию через этот указатель для вычисления факториала 11.

Упражнение 7.22

(a) int (*mpf)(vector<int>&);

(b) void (*apf[20])(doub1e);

Каковы типы следующих объявлений:

(c) void (*(*papf)[2])(int);

Как сделать эти объявления более понятными, используя директивы typedef? Упражнение 7.23

double abs(double);

double sin(double); double cos(double);

Вот функции из библиотеки С, определенные в заголовочном файле <cmath>:

double sqrt(double);

Как бы вы объявили массив указателей на С-функции и инициализировали его этими четырьмя функциями? Напишите main() , которая вызывает sqrt() с аргументом 97.9 через элемент массива.

Упражнение 7.24

Вернемся к примеру sort() . Напишите определение функции

int sizeCompare( const string &, const string & );

Если передаваем1е в качестве параметров строки имеют одинаковую длину, то sizeComipare () возвращает 0; если первая строка короче второй, то отрицательное число, а если длиннее, то положительное. Напоминаем, что длина строки возвращается операцией size() класса string. Измените miain() для вызова sort(), передав в качестве третьего аргумента указатель на sizeCompare() .



8. Область видимости и время жизни

В этой главе обсуждаются два важных вопроса, касающиеся объявлений в С++. Где употребляется объявленное имя? Когда можно безопасно использовать объект или вызывать функцию, т.е. каково время жизни сущности в программе? Для ответа на первый вопрос мы введем понятие областей видимости и покажем, как они ограничивают применение имен в исходном файле программы. Мы рассмотрим разные типы таких областей: глобальную и локальную, а также более сложное понятие областей видимости пространств имен, которое появится в конце главы. Отвечая на второй вопрос, мы опишем, как объявления вводят глобальные объекты и функции (сущности, живущие в течение всего времени работы программы), локальные ( живущие на определенном отрезке выполнения) и динамически размещаемые объекты (временем жизни которых управляет программист). Мы также исследуем свойства времени выполнения, характерные для этих объектов и функций.

8.1. Область видимости

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

Локальная область - это часть исходного текста программ:, содержащаяся в определении функции (или в блоке). Любая функция имеет собственную такую часть, и каждая составная инструкция (или блок) внутри функции также представляет собой отдельную локальную область.

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

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

Каждое определение класса представляет собой отдельную область видимости класса. (О таких областях м1 расскажем в главе 13.)

Имя может обозначать различные сущности в зависимости от области видимости. В следующем фрагменте программы имя s1 относится к четырем разным сущностям:



#include <iostream> #include <string>

сравниваем s1 и s2 лексикографически

int lexicoCompare( const string &sl, const string &s2 ) { ... } сравниваем длины s1 и s2

int sizeCompare( const string &sl, const string &s2 ) { ... }

typedef int ( PFI)( const string &, const string & );

string *s2, PFI compare =lexicoCompare )

сортируем массив строк

void sort( string *s1, string *s2,

{ ... }

string sl[10] = { a , light , drizzle , was , falling , when , they , left , the , school };

int main()

вызов sort() со значением по умолчанию параметра compare s1 - глобальн массив

sort( s1, s1 + sizeof(s1)/sizeof(s1[0]) - 1 );

выводим результат сортировки

for ( int i = 0; i < sizeof(s1) / sizeof(s1[0]); ++i )

cout << s1[ i ].c str() << \n\t ;

Поскольку определения функций lexicoCompare() , sizeCompare() и sort() представляют собой различные области видимости и все они отличны от глобальной, в каждой из этих областей можно завести переменную с именем s1.

Имя, введенное с помощью объявления, можно использовать от точки объявления до конца области видимости (включая вложенные области). Так, имя s1 параметра функции lexicoCompare() разрешается употреблять до конца ее области видимости, то есть до конца ее определения.

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

В общем случае имя должно обозначать одну сущность внутри одной области видимости. Если в предыдущем примере после объявления массива s1 добавить следующую строку, компилятор выдаст сообщение об ошибке:

void s1(); ошибка: повторное объявление s1

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

В С++ имя должно быть объявлено до момента его первого использования в выражении. В противном случае компилятор выдаст сообщение об ошибке. Процесс сопоставления имени, используемого в выражении, с его объявлением называется разрешением. С помощью этого процесса имя получает конкретный смысл. Разрешение имени зависит от способа его употребления и от его области видимости. Мы рассмотрим этот процесс в различных контекстах. (В следующем подразделе описывается разрешение имен в локальной области видимости; в разделе 10.9 - разрешение в шаблонах функций; в конце главы 13 - в области видимости классов, а в разделе 16.12 - в шаблонах классов.)



1 ... 120 121 122 [ 123 ] 124 125 126 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика