8.3.3. Статические локальные объекты
8.3.3. Статические локальные объекты
Внутри функции или составной инструкции можно объявить объект с локальной областью видимости, который, однако, будет существовать в течение всего времени выполнения программы. Если значение локального объекта должно сохраняться между вызовами функции, то обычный автоматический объект не подойдет: ведь его значение теряется каждый раз после выхода.
В таком случае локальный объект необходимо объявить как static (со статической продолжительностью хранения). Хотя значение такого объекта сохраняется между вызовами функции, в которой он определен, видимость его имени ограничена локальной областью. Статический локальный объект инициализируется во время первого выполнения инструкции, где он объявлен. Вот, например, версия функции gcd(),устанавливающая глубину рекурсии с его помощью:
#include iostream
int traceGcd( int vl, int v2 )
{
static int depth = 1;
cout "глубина #" depth++ endl;
if ( v2 == 0 ) {
depth = 1;
return vl;
}
return traceGcd( v2, vl%v2 );
}
Значение, ассоциированное со статическим локальным объектом depth, сохраняется между вызовами traceGcd(). Его инициализация выполняется только один раз – когда к этой функции обращаются впервые. В следующей программе используется traceGcd():
#include iostream
extern int traceGcd(int, int);
int main() {
int rslt = traceCcd( 15, 123 );
cout "НОД (15,123): " rslt endl;
return 0;
}
Результат работы программы:
глубина #1
глубина #2
глубина #3
глубина #4
НОД (15,123): 3
Неинициализированные статические локальные объекты получают значение 0. А автоматические объекты в подобной ситуации получают случайные значения. Следующая программа иллюстрирует разницу инициализации по умолчанию для автоматических и статических объектов и опасность, подстерегающую программиста в случае ее отсутствия для автоматических объектов.
#include iostream
const int iterations = 2;
void func() {
int value1, value2; // не инициализированы
static int depth; // неявно инициализирован нулем
if ( depth iterations )
{ ++depth; func(); }
else depth = 0;
cout " valuel: " value1;
cout " value2: " value2;
cout " sum: " value1 + value2;
}
int main() {
for ( int ix = 0; ix iterations; ++ix ) func();
return 0;
}
Вот результат работы программы:
valuel: 0 value2: 74924 sum: 74924
valuel: 0 value2: 68748 sum: 68748
valuel: 0 value2: 68756 sum: 68756
valuel: 148620 value2: 2350 sum: 150970
valuel: 2147479844 value2: 671088640 sum: -1476398812
valuel: 0 value2: 68756 sum: 68756
value1 и value2 – неинициализированные автоматические объекты. Их начальные значения, как можно видеть из приведенной распечатки, оказываются случайными, и потому результаты сложения непредсказуемы. Объект depth, несмотря на отсутствие явной инициализации, гарантированно получает значение 0, и функция func() рекурсивно вызывает сама себя только дважды.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
8.1. Статические библиотеки
8.1. Статические библиотеки Статические библиотеки представляют собой простые коллекции объектных файлов, объединенных утилитой ar (архиватор), ar группирует объектные файлы в один архив и добавляет таблицу, в которой указано, какие объектные файлы в архиве какие символы
Статические фильтры
Статические фильтры AlphaЗадает уровень прозрачности элемента страницы.При настройке этого фильтра можно использовать следующие параметры:AlphaImageLoadedОтображает графическое изображение внутри элемента страницы между его фоном и содержимым.При настройке этого фильтра
Статические параметры
Статические параметры Информация о текущей версии Windows находится в двух статических параметрах реестра и одном динамическом. Для начала поговорим о статических параметрах — они находятся в ветви реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlProductOptions. Это параметры ProductType и ProductSuite.?
R.9.4 Статические члены
R.9.4 Статические члены Для члена класса, представляющего данные или функцию, можно при описании класса задать спецификацию static. Для статического члена, представляющего данные, в программе существует только один экземпляр, которым владеют все объекты этого класса.
Статические методы
Статические методы Рассмотрим следующий класс Teenager (подросток), который определяет статический метод Complain(), возвращающий случайную строку, полученную с помощью вызова частной вспомогательной функции GetRandomNumber().class Teenager { private static Random r = new Random(); private static int GetRandomNumber(short
Статические конструкторы
Статические конструкторы Вы уже знаете о том, что конструкторы используются для установки значения данных типа во время его создания, Если указать присваивание значения элементу статических данных в рамках конструктора уровня экземпляра, вы обнаружите, что это
Статические классы
Статические классы Язык C# 2005 расширил область применения ключевого слова static путем введения в рассмотрение статических классов. Когда класс определен, как статический, он не допускает создания экземпляров с помощью ключевого слова new и может содержать только
Статические свойства
Статические свойства В C# также поддерживаются статические свойства. Вспомните из главы 3, что статические члены доступны на уровне класса, а не экземпляра (объекта) этого класса. Например, предположим, что тип Employee определяет элемент статических данных, представляющий
Объекты DataSet с множеством таблиц и объекты DataRelation
Объекты DataSet с множеством таблиц и объекты DataRelation До этого момента во всех примерах данной главы объекты DataSet содержали по одному объекту DataTable. Однако вся мощь несвязного уровня ADO.NET проявляется тогда, когда DataSet содержит множество объектов DataTable. В этом случае вы можете
Статические переменные
Статические переменные Название раздела не следует понимать буквально, т. е. считать, что такие переменные не могут изменяться. В действительности слово "статические" здесь означает, что переменные остаются в работе. Они имеют такую же область действия, как
8.3. Локальные объекты
8.3. Локальные объекты Объявление переменной в локальной области видимости вводит локальный объект. Существует три вида таких объектов: автоматические, регистровые и статические, различающиеся временем жизни и характеристиками занимаемой памяти. Автоматический
Статические методы
Статические методы Вы можете объявить некоторые методы класса статическими методами. Для этого вы должны воспользоваться ключевым словом static. Статические методы не принимают параметр this. На использование статических методов накладывается ряд ограничений.•
5.4.4 Статические Члены
5.4.4 Статические Члены Класс – это тип, а не объект данных, и в каждом объекте класса имеется своя собственная копия данных, членов этого класса. Однако некоторые типы наиболее элегантно реализуются, если все объекты этого типа могут совместно использовать (разделять)
5.4.4 Статические Члены
5.4.4 Статические Члены Класс – это тип, а не объект данных, и в каждом объекте класса имеется своя собственная копия данных, членов этого класса. Однако некоторые типы наиболее элегантно реализуются, если все объекты этого типа могут совместно использовать (разделять)
8.5.1 Статические Члены
8.5.1 Статические Члены Член данные класса может быть static; члены функции не могут. Члены не могут быть auto, register или extern. Есть единственная копия статического члена, совместно используемая всеми членами класса в программе. На статический член mem класса cl можно ссылаться cl:mem,