Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0495976_C19D7_shpory_s.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.82 Mб
Скачать

Локальные переменные

Переменные, объявленные внутри функций, называются локальными переменными. В некоторых книгах по С они называются динамическими переменными[2]. В этой книге используется более распространенный термин локальная переменная. Локальную переменную можно использовать только внутри блока, в котором она объявлена. Иными словами, локальная переменная невидима за пределами своего блока. (Блок программы — это описания и инструкции, объединенные в одну конструкцию путем заключения их в фигурные скобки.)

Локальные переменные существуют только во время выполнения программного блока, в котором они объявлены, создаются они при входе в блок, а разрушаются — при выходе из него. Более того, переменная, объявленная в одном блоке, не имеет никакого отношения к переменной с тем же именем, объявленной в другом блоке.

Чаще всего блоком программы, в котором объявлены локальные переменные, является функция. Рассмотрим, например, следующие две функции:

void func1(void){ int x; x = 10;}

void func2(void){ int x; x = -199;}

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

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

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

void f(void)

{ int t;

scanf("%d%*c", &t);

if(t==1) {

char s[80]; /* эта переменная создается только при входе в этот блок */

printf("Введите имя:");

gets(s);

/* некоторые операторы ... */

}

/* здесь переменная s невидима */

}

В этом примере локальная переменная s создается при входе в блок if и разрушается при выходе из него. Следовательно, переменная s видима только внутри блока if и не может быть использована ни в каких других местах, даже если они находятся внутри функции, содержащей этот блок.

Объявление переменных внутри блока программы помогает избежать нежелательных побочных эффектов. Переменная не существует вне блока, в котором она объявлена, следовательно, "посторонний" участок программы не сможет случайно изменить ее значение.

93. Символьные массивы и строковые функции

Хотя языки С и C++ поддерживают тип данных char, в переменных этого типа могут храниться только одиночные символы, но не строки текста. Если в программе необходимо работать со строками, их можно создавать как массивы символов.

В таком массиве для каждого символа строки отводится своя ячейка, а последний элемент содержит символ конца строки — \0. В следующем примере создаются три символьных массива. Массив szvehicle1 заполняется символ за символом с помощью оператора присваивания. Данные в массив szvehicle2 заносятся с помощью функции scanf(), а массив szvehicle3 инициализируется константной строкой.

Эта программа на языке С демонстрирует работу с массивами символов.

#include ‹stdio.h›

main() { char szvehiclel[7], /* машина

*/ szvehicle2[8];

/* самолет */ static char szvehicleS[8] = "корабль";

/* корабль */ szvehiclel[0] = 'м' szvehiclel[1] = 'a' szvehiclel [2] = 'ш' szvehiclel[3] = 'и' szvehiclel[4] = 'н' szvehiclel[5] = 'a' szvehiclel[6] = '\0';

printf ("\n\n\tВведите слово -—> самолет ") ;

scanf("%s",szvehicle2);

printf("%s\n",szvehiclel);

printf("%s\n",szvehicle2);

printf("%s\n",szvehicle3);

return(0); }

То же самое справедливо и для других двух массивов. массив szvehicle3 можно задать путем указания последовательности символов в фигурных скобках:

static char szvehicleS[8]= {'к','о','р','а','б','л','ь','\0'};

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

static char szvehicleS[] = "корабль";

При этом размер массива определяется компилятором автоматически. Часто содержимое массива запрашивается у пользователя с помощью функции scanf( ) , как в случае с массивом szvehicle2.

94.Синтаксис производного класса

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

Любой класс может быть родительским, и любой производный класс будет следовать его описанию. Класс-потомок может иметь дополнительные возможности по сравнению с базовым классом. В производном классе можно изменить права доступа, добавить новые элементы или перегрузить имеющиеся методы.

Синтаксис производного класса:

class ИмяПроизводногоКласса:(public/private/protected) 

ИмяРодительскогоКласса {. . . };

Слова public, private и protected являются модификаторами доступа методов производного класса к элементам родительского класса. Модификатор public не меняет тип доступа, модификатор private делает для всех элементов базового класса тип доступа private, а модификатор protected разрешает доступ методов производного класса к общим элементам базового класса, но запрещает доступ для всех других методов. Если необходимо некоторым элементам изменить тип доступа, то их объявляют в производном классе повторно в соответствующей секции.

Если производный класс имеет всего один родительский класс, то такое наследование называется простым, в противном случае наследование называется сложным. Пример сложного наследования:

class A{. . .};

class B{. . .};

class C:public A, protected B{. . .};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]