статический на разных языках
-
03-07-2019 - |
Вопрос
Я слышал, что между языками существуют различия в значении ключевого слова static
, но я не нашел хорошего списка, который объединял бы эти различия.
Вот что я знаю о значении static
в C++:
- Для локальных статических переменных внутри функции переменная инициализируется при запуске, а значение сохраняется при вызовах функции.
- Статические элементы данных являются общими для всех экземпляров класса.Другими словами, существует только один экземпляр статического элемента данных.Статические элементы данных должны быть инициализированы в области действия файла.
- Статические функции-члены имеют доступ только к статическим членам.
- В рекурсивном коде статический объект или переменная гарантированно будут иметь одинаковое состояние в разных экземплярах блока кода.
- Статические объекты и переменные, определенные в области видимости файла, имеют только внутреннюю связь.Никакие другие файлы не могут их использовать.
Как соотносится значение static
изменить на других языках?
Решение
C
- Ключевое слово может изменять либо связь, либо продолжительность (lifetime) объекта.
- Переменные всегда инициализируются значением 0
- Функции имеют внутреннюю связь.
- Если объявлено в области на уровне файла:переменные имеют внутреннюю связь и статическую длительность (т.е.существует на протяжении всего срока службы программы)
- Если объявлено в области блока:переменные не имеют связи, кроме статической длительности
- В единице перевода может быть несколько объявлений одной и той же статической переменной.Однако обратите внимание, что они должны быть одинаковыми.Например,:в области видимости на уровне файла:
int a; // a has external linkage
static int a; // a now has static linkage
// same as if you wrote: static int a = 0;
//...
static int b; // static linkage
extern int b; // extern loses its meaning, b still has internal linkage
//...
extern int b; // b has external linkage
static int b; // error
//...
void func() {
static int x; // automatic linkage, static duration
// same as if you wrote: static int x = 0;
}
C++
- На уровне файла использование устарело как для переменных, так и для членов в пользу анонимных пространств имен.Существует только как совместимость
- Переменные по-прежнему инициализируются по умолчанию (как в C) равным 0
- "6.7 Нулевая инициализация (8.5) всех локальных объектов со статической продолжительностью хранения (3.7.1) или продолжительностью хранения потока (3.7.2) выполняется перед любой другой инициализацией [...] "
- Переменные имеют статический срок хранения, если они не сопровождаются
thread_local
спецификатор (начиная с C ++ 0x и далее) - В единице перевода может быть только одно определение статического значения
- Переменные-члены / функции означают, что они являются свойствами класса, а не экземпляров Синтаксис легального доступа:экземпляр.свойство или класс::property
- Статические функции-члены могут обращаться только к статическим переменным-членам
Нет
this
указатель для таких функций - Однако нестатические члены могут обращаться к любому статическому члену
- На уровне файла объекты имеют внутреннюю связь, за исключением членов класса, которые имеют область видимости класса
- Члены класса должны быть определены либо в объявлении класса, либо явно извне с помощью имени класса и оператора разрешения области видимости
- Не может использовать
this
в статическом методе
ActionScript ( Сценарий действия )
- Методы класса, как в C ++
- не может использовать
this
илиsuper
в статическом методе - Доступ осуществляется только через имя класса, а не через имя экземпляра
- Не унаследованный
- Производные классы, однако, имеют доступ к статическим свойствам баз
- Переменные, объявленные с использованием ключевых слов static и const, должны быть инициализированы одновременно с объявлением константы
Объектно-ориентированный Дизайн
- Шаблон проектирования Singleton рассматривается многими как прославленный статический объект
- Использованный в шаблоне дизайна фабрики
Возможно, я пропустил много других вещей - не стесняйтесь присоединиться.
Другие советы
В Delphi ключевое слово static используется исключительно для определения методов класса.В Delphi a Нормальный метод класса может быть объявлен виртуальным и переопределен в подклассе.Кроме того, Delphi имеет самость переменная, аналогичная это указатель на других языках.Однако в методе класса самость указывает на класс, в котором вызывается метод, а не на экземпляр.
Объявление метода класса статический означает:
- Он не может быть переопределен в подклассе
- У него нет самость указатель
Это означает, что метод статического класса может обращаться к членам класса только в том классе, в котором он был определен, в то время как обычный метод класса может обращаться к переопределенным членам класса в производных классах.
В документации Delphi есть и другие неофициальные варианты использования static, обычно относящиеся к неизменяемости функции (это такое слово?).Например, статический массив против динамического массива.Все методы экземпляра в Delphi являются статическими, если не объявлено иное.
В VB.NET, а Static
переменная точно так же похожа на локальную статическую переменную C ++.
Однако общеклассового подхода не существует Static
;использование Shared
вместо этого.
В C # есть 3 способа использования ключевого слова static:
- В определении класса, что означает, что класс будет предоставлять только статические члены и не может быть создан
- На члене класса, что означает, что член может быть вызван без необходимости создания экземпляра класса.
- В конструкторе, что означает, что статический конструктор всегда будет вызываться до вызова статического члена.(В основном это узкие места в производительности, поэтому они не рекомендуются)
Надеюсь, это поможет.
В C # это в значительной степени всегда означает:"относится к типу, а не к экземпляру этого типа".
Python имеет декоратор @staticmethod, который при применении к члену класса делает метод доступным в классе, а не в экземплярах, и не передает методу автоматических аргументов.Декоратор @classmethod выполняет аналогичную функцию, но передает класс в качестве первого аргумента, что делает его гораздо более полезным.
В C static помечает функцию или глобальную переменную как локальную по отношению к файлу, в котором она находится.
Это что-то вроде private на других языках.Вроде того.
Если это в функции, то static предварительно выделяет эту переменную в разделе данных двоичного файла, а не в стеке во время выполнения.
В VB.NET static используется на уровне процедуры, чтобы означать, что переменная связана со всеми выполнениями процедуры (она сохраняется от вызова к вызову).Однако это немного непонятное использование в объектно-ориентированном приложении.
Аналог является "Общим", что означает, что метод или элемент имеет уровень типа (вам не нужен экземпляр для доступа к нему).
Википедия обобщает множество различных значений static
:
Статические Методы, статические переменные, статическая типизация.