Статические локальные переменные
Когда static применяется к локальной переменной, это приводит к тому, что компилятор создает долговременную область для хранения переменной почти таким же способом, как это делается для глобальной переменной. Ключевое различие между статической локальной и глобальной переменными заключается в том, что статическая локальная переменная остается известной только в том блоке, в котором она была объявлена. Проще говоря, статическая локальная переменная — это локальная переменная, сохраняющая свое значение между вызовами функций.
Наличие статических локальных переменных очень важно для создания самостоятельных функций поскольку имеется несколько типов подпрограмм, сохраняющих значение между вызовами. Если использование статических переменных недопустимо, то следует использовать глобальные переменные, но это может привести к побочным эффектам. Ниже приведен простой пример того, как статитеская локальная переменная может использоваться в функции count():
int count (int i) ;
do count(0);
>
while(!kbhit());
printf(«count called %d times», count (1));
return 0;
>
int count (int i)
static int c=0;
if(i) return c;
else c++;
return 0;
>
Иногда полезно знать, как часто функция вызывается во время работы программы. Это возможно сделать через использование глобальных переменных, но лучшим вариантом является использование функции, сохраняющей информацию внутри себя, как это сделано в функции count(). В данном примере, если count() вызывается со значением 0, то переменная с увеличивается. (Скорее всего в настоящих приложениях функция будет также выполнять некоторую другую полезную работу.) Если count() вызывается с любым другим значением, то она возвращает число сделанных вызовов. Подсчет числа вызовов функции может быть полезен при разработке программы, которая вызывает эти функции достаточно часто, и требуется привлечь к вызовам внимание.
Другим хорошим примером функции, требующей использования статических локальных переменных, является генератор последовательности чисел, создающий новое число, основываясь на старом. Это можно сделать, объявив глобальную переменную. Тем не менее, каждый раз, когда функция используется в программе, следует помнить об объявлении глобальной переменной и постоянно необходимо смотреть: не конфликтует ли переменная с другими, ранее объявленными, переменными. Также использование глобальной переменной приводит к тому, что функцию трудно поместить в библиотеку функций. Лучшим решением является объявление переменной, содержащей сгенерированное число как static, как в нижеприведенном фрагменте.
int series(void)
static int series_num;
series_num = series_num+23;
return(series_num);
>
В данном примере переменная series_num существует между вызовами функций вместо того, чтобы каждый раз создаваться и уничтожаться как обычная локальная переменная. Это означает, что каждый вызов series() может создать новый член серии, основываясь на последнем члене без глобального объявления переменной.
Можно было заметить нечто необычное в функции series(). Статическая переменная series_num не инициализируется. Это означает, что при первом вызове функции series_num имеет значение по умолчанию 0. Хотя это приемлемо для некоторых приложений, большинство генераторов последовательности требуют какую-либо другую стартовую точку. Чтобы сделать это, требуется инициализировать series_num до первого вызова series(), что может быть легко сделано, если series_num является глобальной переменной. Тем не менее, следует избегать использования series_num как глобальной переменной и лучше объявить ее как static. Это приводит ко второму способу использования static.
Static c что это
Какой смысл несёт модификатор static для:
1) переменных, объявленных внутри функции .
2) глобальных объектов .
Девиз настоящих студентов: Не боись — ПРОРВЁМСЯ
Re: смысл static
| От: | Mink | |
| Дата: | 28.08.02 08:26 | |
| Оценка: | -1 | |
Здравствуйте GromRom, Вы писали:
GR>Какой смысл несёт модификатор static для:
GR>1) переменных, объявленных внутри функции .
Значение переменной сохраняется между вызовами функции и пременная инициализируется по умолчанию.
GR>2) глобальных объектов .
Память под объект выделяется при старте программы и освобождается при завершении и используется внутреннее связывание (internal linkage).
GR>Заранее благодарен.
Сила, она в ньютонах
Re: смысл static
| От: | ZakkeR | http://znav.narod.ru |
| Дата: | 28.08.02 08:28 | |
| Оценка: | 9 (1) | |
Здравствуйте GromRom, Вы писали:
GR>Какой смысл несёт модификатор static для:
GR>1) переменных, объявленных внутри функции .
GR>2) глобальных объектов .
GR>Заранее благодарен.
внутри функции: для переменной явно отводится память в области данных программы, т.е. после завершения функции содержимое переменной остается. Отличие от глобального объекта — область видимости ограничена данной функцией.
для глобальных объектов это ограничивает область их видимости данным модулем. Т.е. глобальная переменная с модификатором static не видна из других модулей, даже если писать extern имя;. Линкер просто ее не увидит.
кстати, к функциям это тоже относится. Так что если пожелаешь иметь в разных модулях функции с одинаковыми именами, то без static тебе не обойтись.
Смысл static
| От: | Павел Кузнецов | |
| Дата: | 28.08.02 08:44 | |
| Оценка: | 66 (10) +1 -1 | |
| #Имя: | FAQ.cpp.static | |
GR>Какой смысл несёт модификатор static для:
GR>1) переменных, объявленных внутри функции .
GR>2) глобальных объектов .
static — «перегруженное» ключевое слово C++.
1) При объявлении члена класса (функции или переменной) ключевое слово static означает, что этот член класса является статическим. К статическим членам класса разрешен доступ вида: T::member. Статические фуннкции-члены класса не имеют неявного формального параметра this, не могут быть виртуальными или иметь модификатор const. Статические переменные не являются частью объектов данного класса, т.е. являются «общими» для всех объектов данного класса. Понятие статической переменной класса ближе всего к глобальным переменным C/C++ с точностью до правил доступа. В объектно ориентированной терминологии нестатические члены класса принято называть членами объекта (instance member), а статические — членами класса (class member).
class Object < static void foo(); static int i; >; int Object::i = 0; void Object::foo()
Стандарт C++: 9.4 [class.static].
Страуструп. Язык программирования C++, 3-е издание: 10.2.4 [class.static].
2) При объявлении локальных переменных функции ключевое слово static означает, что переменная имеет статический класс памяти (static storage duration), т.е. существует в течение всего времени выполнения программы, в отличие от переменных с локальным классом памяти (automatic storage duration).
void foo() < static int i = 0; >
Стандарт C++: 3.7.1 [basic.stc.static].
Страуструп. Язык программирования C++, 3-е издание: 7.1.2 [fct.static].
3) При объявлении переменных или функций на глобальном уровне (точнее, namespace scope), ключевое слово static означает, что переменная или функция имеет внутреннее связывание (internal linkage), т.е. к ним нет доступа из других единиц трансляции (translation units).
static int i = 0; static void foo()
Стандарт C++: 3.5 [basic.link].
Страуструп. Язык программирования C++, 3-е издание: 9.2 [file.link].
Примечание: использование ключевого слова static в последнем значении не рекомендовано комитетом стандартизации C++ (is deprecated). Вместо этого рекомендуют использовать анонимные namespace (хотя, по более свежей информации, может быть, статус deprecated будет снят со static в этом значении для улучшения совместимости с C).
namespace < int i = 0; void foo() < >>
Стандарт C++: D.2 [depr.static].
Страуструп. Язык программирования C++, 3-е издание: B.2.3.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: смысл static
| От: | Павел Кузнецов |
| Дата: | 28.08.02 08:49 |
| Оценка: |
Здравствуйте ZakkeR, Вы писали:
ZR>Так что если пожелаешь иметь в разных модулях функции с одинаковыми именами, то без static тебе не обойтись.
Это утверждение не является верным. Для решения этой проблемы в C++ введены анонимные namespace, являющиеся более общим способом. Например, static не позволяет ограничить «видимость» (с точки зрения компоновщика) имени класса одним модулем.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Смысл static
| От: | Lone |
| Дата: | 18.08.04 19:41 |
| Оценка: |
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Примечание: использование ключевого слова static в последнем значении не рекомендовано комитетом стандартизации C++ (is deprecated). Вместо этого рекомендуют использовать анонимные namespace (хотя, по более свежей информации, может быть, статус deprecated будет снят со static в этом значении для улучшения совместимости с C).
А какие преимущества дает использование анонимных пространств имен вместо ключевого слова static в последнем значении? Просто всегда static использовал и даже не задумывался об этом.
«Жизнь проходит не так, как представлялось в детстве» © Остап Бендер
Re[2]: Смысл static
| От: | Шахтер |
| Дата: | 18.08.04 21:40 |
| Оценка: |
Здравствуйте, Lone, Вы писали:
L>Здравствуйте, Павел Кузнецов, Вы писали:
ПК>>Примечание: использование ключевого слова static в последнем значении не рекомендовано комитетом стандартизации C++ (is deprecated). Вместо этого рекомендуют использовать анонимные namespace (хотя, по более свежей информации, может быть, статус deprecated будет снят со static в этом значении для улучшения совместимости с C).
L>А какие преимущества дает использование анонимных пространств имен вместо ключевого слова static в последнем значении? Просто всегда static использовал и даже не задумывался об этом.
Например, можно сделать класс, видимый только в данной еденице трансляции. Со static ом такое сделать нельзя.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Смысл static
| От: | Павел Кузнецов |
| Дата: | 19.08.04 00:39 |
| Оценка: |
Шахтер:
> L>А какие преимущества дает использование анонимных пространств имен вместо ключевого слова static в последнем значении? Просто всегда static использовал и даже не задумывался об этом.
> Например, можно сделать класс, видимый только в данной еденице трансляции. Со static ом такое сделать нельзя.
Static: Многоцелевое ключевое слово
Большинство ключевых слов C++ позволяют сделать одну вещь. Вы используете int для объявления целочисленной переменной, или тогда, когда функция возвращает целое значение, или принимает целое число в качестве аргумента. Вы используете оператор new для выделения памяти, а оператор delete — для ее освобождения. Вы можете использовать const для указания, что значение переменной не может быть изменено. По иронии судьбы, ключевое слово static , хотя и означает «неизменный», имеет несколько (и, видимо, не связанных между собой) способов использования. Ключевое слово static может быть использовано в трех основных контекстах:
- внутри функции;
- внутри определения класса;
- перед глобальной переменной внутри файла, составляющего многофайловую программу.
Использование static внутри функции является самым простым. Это просто означает, что после того, как переменная была инициализирована, она остается в памяти до конца программы. Вы можете думать об этом, как о переменной, которая хранит свое значение до полного завершения программы. Например, вы можете использовать статическую переменную для записи количества раз, когда функция была вызвана, просто добавив строки static int count = 0; и count++; в функцию. Так как count является статической переменной, строка static int count = 0; будет выполняться только один раз. Всякий раз, когда функция вызывается, count будет иметь последнее значение, данное ему.
Вы также можете использовать static таким образом, чтобы предотвратить переинициализацию переменной внутри цикла. Например, в следующем коде переменная number_of_times будет равна 100, несмотря на то что строка static int number_of_times = 0; находится внутри цикла, где она, по-видимому, должна исполнятся каждый раз, когда программа доходит до цикла. Хитрость заключается в том, что ключевое слово static препятствует повторной инициализации переменной. Одной из особенностей использования ключевого слова static является то, что оно автоматически устанавливает переменную в ноль для вас — но не полагайтесь на это (это делает ваши намерения неясными).
for(int ix=0; ix < 10; ix++) < for(int iy = 0; iy < 10; iy++) < static int number_of_times = 0; number_of_times++; >>
Вы можете использовать статические переменные для сохранения информации о последнем значении возвращенной функции, например, если вы хотите сохранить максимальное значение, рассчитанное по функции. Если вы делаете разбор строки, вы можете также хранить последний знак, возвращенный функцией, для того, чтобы иметь возможность вызвать ее с аргументом, означающим, что она должна вернуть последний знак.
Второе использование static — внутри определения класса. Хотя большинство переменных, объявленных внутри класса могут иметь разное значение в каждом экземпляре класса, статические поля класса будут иметь то же значение для всех экземпляров данного класса и даже не обязательно создавать экземпляр этого класса. Полезно представить себе, что статические переменные класса содержат информацию, необходимую для создания новых объектов (например в фабрике классов). Например, если вы хотите пронумеровать экземпляры класса, можно использовать статическую переменную для отслеживания последнего используемого номера. Важно отметить, что хорошим тоном при использовании статических переменных класса является использование class_name::х; , а не instance_of_class.x; . Это помогает напомнить программисту, что статические переменные не принадлежат к одному экземпляру класса, и что вам не обязательно создавать экземпляр этого класса. Как вы уже, наверное, заметили, для доступа к static можно использовать оператор области видимости, :: , когда вы обращаетесь к нему через имя класса.
Важно иметь в виду, при отладке или реализации программы с использованием static , что вы не можете инициализировать его внутри класса. В самом деле, если вы решите написать весь код класса в файл заголовка, вы даже не сможете инициализировать статическую переменную внутри файла заголовка; сделайте это в файле .cpp . Кроме того, вам необходимо инициализировать статические члены класса, или их не будет в области видимости. (Синтаксис немного странный: type class_name::static_variable = value .)
У вас также могут быть статические функции класса. Статические функции — это функции, которые не требуют экземпляра класса и вызываются так же, по аналогии со статическими переменным, с именем класса, а не с именем объекта. Например, a_class::static_function(); , а не an_instance.function(); . Статические функции могут работать только со статическими членами класса, так как они не относятся к конкретным экземплярам класса. Статические функции могут быть использованы для изменения статических переменных, отслеживать их значения — например, вы можете использовать статическую функцию, если вы решили использовать счетчик, чтобы дать каждому экземпляру класса уникальный идентификатор.
Например, вы можете использовать следующий код:
class user < private: int id; static int next_id; public: static int next_user_id() < next_id++; return next_id; >// остальные методы для класса user user() // конструктор класса < // или вызов метода, >>; int user::next_id = 0;
Обратите внимание, что вы должны включать тип статической переменной, когда вы устанавливаете его!
user a_user;
установит идентификатор на следующий идентификационный номер, не используемый любым другим объектом user . Обратите внимание, что это хороший стиль объявления идентификатора как константы.
Последнее использование static — глобальная переменная в файле кода. В этом случае использование static указывает, что исходный код в других файлах, которые являются частью проекта, не может получить доступ к переменной. Только код внутри того же файла может увидеть переменную (её область видимости ограничена файлом). Эта техника может быть использована для моделирования объектно-ориентированного кода, потому что она ограничивает видимость переменных и таким образом помогает избежать конфликта имен. Этот способ использования static является пережитком Cи.
К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!
C# и ключевое слово static

Метод – это именованный блок кода, в котором выполняются те или иные операции. Соответствующий фрагмент обладает рядом инструкций, выполнение которых приводит к определенному результату. Программа будет обращаться к данному элементу, инициируя обработку прописанных указаний.
В C# все инструкции будут выполняться в контексте метода. В объектно-ориентированном программировании так называют функцию или процедуру, принадлежащую к тому или иному классу/объекту.
Все methods бывают:
- простыми;
- статическими.
Данная статья расскажет о второй категории и ключевом слове static в C Sharp.
Ключевое слово static в C#
Static – это ключевое слово, которое широко применяется в программировании, включая Си Шарп. Иногда нужно определять член класса, который будет применяться независим от всех остальных объектов этого класса. Доступ к члену организовывается путем объекта класса. Но есть и другое решение. В программировании допускается создание отдельного члена класса без ссылок на конкретный экземпляр объекта. В этом помогает ключевое слово static.
Если члены этого же класса объявляются в качестве статических, они становятся доступными до создания разных объектов своего класса без ссылок на objects. Существует множество различных методов рассматриваемого типа. Наиболее распространенный – Main(). Он объявляется статическим из-за того, что должен вызываться имеющейся системой при запуске того или иного приложения.
Для использования статическим членом за пределами класса, нужно прописать class name с оператором-точкой. Никакого создания объекта не потребуется. Члены типа static оказываются доступными не по ссылкам, а по именам класса.
Говоря о переменных, можно отметить, что static – это глобальные переменные по своему существу. Если объекты будут созданы в своем же классе, копии переменных статического типа не образовываются. Вместо этого все экземпляры будут использованы совместно с одной и той же переменной типа static.
Общая информация о статических классах и методах
Static methods – это методы класса. Они не имеют доступа к данным объекта. Чтобы ими пользоваться, не нужно создавать экземпляры данного класса. Это общее правило в программировании. На C# оно тоже распространяется.
В качестве статических данных могут использоваться:
- методы;
- классы;
- переменные (public static int, public void и так далее).
Для того, чтобы класс (переменная или method) стали статическими, нужно грамотно объявить их. А именно – использовать ключевое слово static.
Статический класс – это класс, который объявляется по указанному ранее принципу в плане синтаксиса. Ниже можно увидеть форму его реализации в программном коде:
Здесь className – это имя статического класса.
Ограничения
При использовании рассматриваемого вида методов в C# нужно помнить о некоторых ограничениях:
- Нельзя использовать ссылку this. Связано это с тем, что такие «инструкции» не будут выполняться относительно имеющихся в программном коде объектов.
- Можно непосредственно вызвать static из других методов с аналогичным «спецификатором». Исключение – если речь идет о methods того же самого class. Это объясняется оперированием определенными объектами. Они у рассматриваемого «элемента» отсутствуют.
- Точно такие же ограничения будут наложены и на данные с рассматриваемым модификатором. Метод не сможет управлять переменными экземпляра из-за отсутствия объектов, в которых соответствующие манипуляции были бы доступны.
Этой информации достаточно для того, чтобы работать со статическими элементами в C#. Далее предстоит разобраться с несколькими наглядными примерами. Они помогут усвоить материал более быстро.
Конструктор
Конструкторы тоже могут стать статическими. Они применяются специально для того, чтобы инициализировать элементы, используемые в пределах всего class, а не по конкретному экземпляру его объекта (члены будут инициализироваться конструктором до их создания).
Здесь нужно запомнить, что:
- у конструкторов нет модификаторов доступа;
- параметры не принимаются;
- вызывать в программе конструктор вручную не представляется возможным.
Конструктор потребуется, если нужно выполнить действия в программном коде, которые реализовываются всего один раз.
Выше – наглядный пример такого конструктора. Он вызывается автоматически. Происходит это тогда, когда класс загружается впервые, еще до конструктора экземпляра. Отсюда следует простой вывод: статические конструкторы выполняются до любых конструкторов экземпляра. У них также отсутствуют модификаторы доступа – они применяются с параметром «по умолчанию». Все это делает вызов конструктора непосредственно из приложения невозможным.
Классы
С формой представления такого статического элемента все ясно. Теперь можно рассмотреть наглядный пример, разобравшись с особенностями изучаемого компонента.
Static Class имеет два свойства:
- его объекты нельзя создавать;
- он должен включать в себя исключительно члены такого же типа.
А вот – наглядный пример в действии:
При его обработке на экране будет выведен результат:
Применяются classes упомянутого типа в двух случаях: при создании метода расширения (они связаны преимущественно с языком LINQ), а также для того, чтобы хранить совокупности связанных static-методов. Выше – пример кода и результата второго случая.
Методы
А вот – пример static-метода:
Такие элементы определяют общее для всех объектов поведение в программном коде. В предложенном примере в Person использован статический метод CheckRetirementStatus(). Он в виде параметра будет принимать объект Person, после чего производит проверку пенсионного статуса.
Секрет быстрого обучения
Освоить любой язык программирования и его особенности, а также инструменты и функции можно, обратившись к туториалам и видео-урокам . Самообразование – неплохой вариант для новичков, которые не уверены, что хотят заниматься разработкой.
Можно выучиться в ВУЗе, потратив на это много времени и денег. Подход неплохой, но в большинстве университетов C# не изучается – разве что поверхностно. Зато подтвердить приобретенные навыки получится при помощи диплома государственного образца.
Самым лучшим способом вливания в любую IT-профессию, а также язык программирования, является посещение дистанционных онлайн курсов. В срок до 12 месяцев пользователей научат с нуля разбираться в кодах, объяснят, как работают main и return, а также научат писать собственные приложения на выбранном языке. Пример – образовательный центр OTUS.
Во время обучения гарантируется поддержка кураторами и интересные домашние задания. Пользователи смогут сформировать портфолио и попрактиковаться как в простых, так и в сложных задачах. В конце обучения каждый получит электронный сертификат, подтверждающий приобретенный спектр умений и знаний документально. Обучение проходит полностью через интернет. Вернуться к вебинарам пользователь сможет в любое удобное ему время.

Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus !