что такое статический объект
Статические и динамические объекты
Статические объекты находятся в «застывшем» состоянии или рассматриваются в какой-либо момент времени безотносительно того, каким было его состояние в прошлом или будет в будущем. Динамика рассматривает причинно-следственные цепочки и возможность прогнозирования будущих состояний объектов. Каждый динамический объект имеет свойство последствия (инерции) – состояние движущегося тела в некоторый момент времени определяется не только силами, действующими в тот момент, но и предшествующими воздействиями: состояние объекта имеет предысторию его движения. В дифференциальных уравнениях предыстория объекта задается начальными условиями.
Развитие механики пространственных протяженных сред, а также теории колебаний и волн выявило еще один источник последствия, не связанный непосредственно с инерционными эффектами. Речь идет о конечной скорости распространения механических возмущений, например колебательных в сплошной среде, результатом чего является зависимость текущего состояния некоторой точки от прошлых состояний других точек и, следовательно, объекта в целом.
Нельзя связывать последствия только с традиционными представлениями об инерционных эффектах. Явление последствия имеет более общий характер. Существуют и другие физические явления, например резонанс и запаздывание в каналах связи, которые дают последствия в материальных объектах. Существуют также информационные запаздывания в управляемых системах.
Н. Винер ввел обобщенное представление о зависимости между входной и выходной переменными произвольного объекта в форме
,
где u(t), x(t) – вектор-функции входов и соответственно выходов;
– обобщенный оператор объекта;
ti – t0 = θ – интерпретируемый как внутренняя память объекта интервал времени, в пределах которого прошлые состояния объекта влияют на текущее значение x(ti). При этом очевидно, что условием физической реализуемости объекта является неравенство t ≤ ti, ибо следствие (выход) в реальной системе не может предшествовать причине (входу). θ варьируется в переделах от 10 –9 до десятков и сотен лет (табл. 1.1).
Время внутренней памяти объекта
Тип системы (объекта) | Память | |
Единица измерения | Порядок | |
Радиоэлектронные системы | с | 10 –3 … 10 –9 |
Механические и электромеханические системы (машины, агрегаты, генераторы и др.) | с | 10 –2 … 10 |
Крупные транспортные системы (суда, ж/д транспорт, нефте- и газопроводы) | мин | 1 … 10 |
Крупные термические агрегаты (металлургические печи, котлы) | ч | 1 …10 2 |
Производственно-экономические системы | месяцы | 10 –1 …10 |
Крупные производственно-экономические системы | месяцы, годы | – |
Крупные экосистемы, биосферные процессы | годы, десятилетия | – |
Массовые социально-психологические явления (ценностные установки, убеждения, мировоззрения) | столетия | – |
Дата добавления: 2015-03-19 ; просмотров: 2014 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ
Всем привет. На одном из код-ревью я столкнулся с мыслью, что многие, а чего скрывать и я сам, не то чтобы хорошо понимаем когда нужно использовать ключевое слова static. В данной статье я хотел бы поделиться своими знаниями и информацией по поводу ключевого слова static. Статья будет полезна как начинающим программистам, так и людям, работающим с языком С++. Для понимания статьи у вас должны быть знания о процессе сборки проектов и владение языком С/С++ на базовом уровне. Кстати, static используется не только в С++, но и в С. В этой статье я буду говорить о С++, но имейте в виду, что всё то, что не связано с объектами и классами, в основном применимо и к языку С.
Что такое static?
Где используется?
Ниже приведена схема, как и где используется static в программе.
А теперь я постараюсь детально описать все то, что изображено на схеме. Поехали!
Статические переменные внутри функции
Если не использовать static в строке 4, выделение памяти и инициализация переменной count происходит при каждом вызове функции counter(), и уничтожается каждый раз, когда функция завершается. Но если мы сделаем переменную статической, после инициализации (при первом вызове функции counter()) область видимости count будет до конца функции main(), и переменная будет хранить свое значение между вызовами функции counter().
Статические объекты класса
В строке 3 мы создаем класс Base с конструктором (строка 5) и деструктором (строка 8). При вызове конструктора либо деструктора мы выводим название метода класса в консоль. В строке 14 мы создаем статический объект obj класса Base. Создание этого статического объекта будет происходить только при первом вызове функции foo() в строке 18.
Из-за того, что объект статический, деструктор вызывается не при выходе из функции foo() в строке 15, а только при завершении программы, т.к. статический объект разрушается при завершении программы. Ниже приведен пример той же программы, за исключением того, что наш объект нестатический.
Если мы уберем static при создании переменной в функции foo(), то разрушение объекта будет происходить в строке 15 при каждом вызове функции. В таком случае вывод программы будет вполне ожидаемый для локальной переменной с выделенной памятью на стеке:
Статические члены класса
В сравнении с предыдущими вариантами использования, статические члены класса немного сложнее для понимания. Давайте разберемся, почему. Предположим, у нас есть следующая программа:
В нашем примере мы создали класс А (строка 3) и класс В (строка 9) со статическими членами класса (строка 15). Мы предполагаем, что при создании объекта b в строке 19 будет создан объект a в строке 15. Так бы и произошло, если бы мы использовали нестатические члены класса. Но вывод программы будет следующим:
Причиной такого поведения является то, что статические члены класса не инициализируются с помощью конструктора, поскольку они не зависят от инициализации объекта. Т.е. в строке 15 мы только объявляем объект, а не определяем его, так как определение должно происходить вне класса с помощью оператора разрешения области видимости (::). Давайте определим члены класса B.
Теперь, после того как мы определили наш статический член класса в строке 18, мы можем увидеть следующий результат программы:
Constructor A
Constructor B
Destructor B
Destructor A
Нужно помнить, что член класса будет один для всех экземпляров класса B, т.е. если мы создали три объекта класса B, то конструктор статического члена класса будет вызван только один раз. Вот пример того, о чем я говорю:
Constructor A
Constructor B1
Constructor B2
Constructor B3
Destructor B3
Destructor B2
Destructor B1
Destructor A
Статические функции
Для того чтобы исправить данную проблему, одну из функций мы объявим статической. Например эту:
В этом случае вы говорите компилятору, что доступ к статическим функциям ограничен файлом, в котором они объявлены. И он имеет доступ только к функции sum() из math.cpp файла. Таким образом, используя static для функции, мы можем ограничить область видимости этой функции, и данная функция не будет видна в других файлах, если, конечно, это не заголовочный файл (.h).
Статические функции-члены класса (методы)
Статическую функцию-член вы можете использовать без создания объекта класса. Доступ к статическим функциям осуществляется с использованием имени класса и оператора разрешения области видимости (::). При использовании статической функции-члена есть ограничения, такие как:
В классе A в строке 8 у нас есть статическая функция-член foo(). В строке 14, мы вызываем функцию используя имя класса и оператор разрешения области видимости и получаем следующий результат программы:
Из вывода видно, что никакого создания объекта нет и конструктор/деструктор не вызывается.
Если бы метод foo() был бы нестатическим, то компилятор выдал бы ошибку на выражение в строке 14, т.к. нужно создать объект для того, чтобы получить доступ к его нестатическим методам.
Заключение
В одной статье в интернете я нашел совет от автора – «Используйте static везде, где только можно». Я хотел бы написать, почему так делать не стоит, а стоит использовать только в случае необходимости.
Классы и объекты C#: ключевое слово static
Ключевое слово static
В документации Microsoft по языку C# дословно сказано следующее:
Посмотрим, что это означает на практике.
Использование методов C# без создания объекта
При использовании же ключевого слова static метод будет принадлежать именно классу (типу данных), а не объекту и вызвать такой метод можно без создания объекта. Для демонстрации использования модификатора static допишем наш класс следующим образом:
Должен получиться вот такой код:
Теперь посмотрим что будет выводиться в консоли, если выполнить вот такой код:
Здесь мы вызываем статический метод каждый раз после создания очередного объекта. При этом обратите внимание, что мы всегда обращаемся к статическому методу,указывая тип данных, а не ссылку на объект (по другому обратиться к статическому методу в C# нельзя). В консоли вы увидите следующий вывод:
Статическая переменная не обнулялась каждый раз при создании объекта, а наращивалась на единицу. И это поведение нам следует запомнить:
Инициализация статических полей
Чтобы инициализировать статическое поле в C# можно использовать такие варианты:
Присвоение значения по умолчанию
Например,как мы это сделали в нашем классе:
Использование статического конструктора
Например, в нашем классе можно определить вот такой статический конструктор:
Статические классы
Кроме того, что вы можете объявлять статические члены класса (поля, методы, свойства), в C# вы можете объявлять статическими целые классы. Объявить статический класс можно так:
Итого
Статика в C#
Волею судьбы в последние годы у меня появилось ещё одно очень увлекательное хобби – учить. Я занимаюсь обучением людей, которые хотят стать программистами C#. Люди приходят разные: технари, гуманитарии, кто-то по своей воле, кого-то направляют от организаций. Не смотря на различные уровни, мне нужно их обучать. Поэтому я стараюсь постоянно обновлять и улучшать свои обучающие материалы. В связи с чем, пришёл к выводу: «А не плохо было бы оформить материалы в текстовом виде, чтобы ими было удобно пользоваться». Под катом я выложил как пример одну из недавно оформленных лекций.
Общая концепция
Статика подразумевает, что вам не нужно создавать экземпляр класса. Все приведённые выше составляющие класса, доступны посредством указания его имени.
Следует отметить, что необязательно делать весь класс статическим. Иногда достаточно применить статику для отдельных его членов.
Больше деталей
Выше мы не рассматривали такую конструкцию, как статический конструктор. Один из достаточно интересных вопросов, на мой взгляд, когда происходит вызов статического конструктор у классов?
Я думаю вы уже обратили внимание, что для статического конструктора не используется спецификатор доступа. Всё очень очевидно, создание статики вы не контролируете. Если попробовать выполнить приведённый ниже код, то можно убедиться в верности следующего утверждения: статический конструктор вызывается перед доступом к любому члену класса.
Можно поиграться, закомментировав любую из строк в которых происходит обращение к классу Box. Теперь немного изменим код, и подправим наше утверждение
В данном случае вызов статического конструктора не происходит. Итак: статический конструктор вызывается перед доступом к любому члену класса, за исключением констант. Я не зря использовал слово класс в данном определении. Со структурами очень много “приколов”. Вы должно быть знаете, что в C# нельзя переопределить конструктор по-умолчанию, но можно определить статический конструктор без параметров. Однако он будет вызываться не всегда, так например не произойдёт его вызов, если вы, например, попытаетесь создать массив структур.
Общие рассуждения об использовании статики
Полиморфизм
Как упоминалось выше, статические классы не поддерживают наследование, т.е. вы не можете наследоваться от интерфейса или другого класса и таким образом расширить функциональность.
Тестирование
При использование статики тестирование достаточно затруднено. Нельзя оперативно подменять код, основываясь на интерфейсах. Если нужно менять, то серьёзно, переписывая значительные куски кода.
8.3.3. Статические локальные объекты
8.3.3. Статические локальные объекты
Внутри функции или составной инструкции можно объявить объект с локальной областью видимости, который, однако, будет существовать в течение всего времени выполнения программы. Если значение локального объекта должно сохраняться между вызовами функции, то обычный автоматический объект не подойдет: ведь его значение теряется каждый раз после выхода.
В таком случае локальный объект необходимо объявить как static (со статической продолжительностью хранения). Хотя значение такого объекта сохраняется между вызовами функции, в которой он определен, видимость его имени ограничена локальной областью. Статический локальный объект инициализируется во время первого выполнения инструкции, где он объявлен. Вот, например, версия функции gcd(),устанавливающая глубину рекурсии с его помощью:
int traceGcd( int vl, int v2 )
static int depth = 1;
cout «глубина #» depth++ endl;
return traceGcd( v2, vl%v2 );
Значение, ассоциированное со статическим локальным объектом depth, сохраняется между вызовами traceGcd(). Его инициализация выполняется только один раз – когда к этой функции обращаются впервые. В следующей программе используется traceGcd():
extern int traceGcd(int, int);
int rslt = traceCcd( 15, 123 );
cout «НОД (15,123): » rslt endl;
Результат работы программы:
Неинициализированные статические локальные объекты получают значение 0. А автоматические объекты в подобной ситуации получают случайные значения. Следующая программа иллюстрирует разницу инициализации по умолчанию для автоматических и статических объектов и опасность, подстерегающую программиста в случае ее отсутствия для автоматических объектов.
const int iterations = 2;
int value1, value2; // не инициализированы
static int depth; // неявно инициализирован нулем
if ( depth iterations )
cout » valuel: » value1;
cout » value2: » value2;
cout » sum: » value1 + value2;
for ( int ix = 0; ix iterations; ++ix ) func();
Вот результат работы программы:
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: 0 value2: 68756 sum: 68756
value1 и value2 – неинициализированные автоматические объекты. Их начальные значения, как можно видеть из приведенной распечатки, оказываются случайными, и потому результаты сложения непредсказуемы. Объект depth, несмотря на отсутствие явной инициализации, гарантированно получает значение 0, и функция func() рекурсивно вызывает сама себя только дважды.
Читайте также
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,