Вопрос

Я слышал, что между языками существуют различия в значении ключевого слова 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 имеет самость переменная, аналогичная это указатель на других языках.Однако в методе класса самость указывает на класс, в котором вызывается метод, а не на экземпляр.

Объявление метода класса статический означает:

  1. Он не может быть переопределен в подклассе
  2. У него нет самость указатель

Это означает, что метод статического класса может обращаться к членам класса только в том классе, в котором он был определен, в то время как обычный метод класса может обращаться к переопределенным членам класса в производных классах.

В документации Delphi есть и другие неофициальные варианты использования static, обычно относящиеся к неизменяемости функции (это такое слово?).Например, статический массив против динамического массива.Все методы экземпляра в Delphi являются статическими, если не объявлено иное.

В VB.NET, а Static переменная точно так же похожа на локальную статическую переменную C ++.

Однако общеклассового подхода не существует Static;использование Shared вместо этого.

В C # есть 3 способа использования ключевого слова static:

  • В определении класса, что означает, что класс будет предоставлять только статические члены и не может быть создан
  • На члене класса, что означает, что член может быть вызван без необходимости создания экземпляра класса.
  • В конструкторе, что означает, что статический конструктор всегда будет вызываться до вызова статического члена.(В основном это узкие места в производительности, поэтому они не рекомендуются)

Надеюсь, это поможет.

В C # это в значительной степени всегда означает:"относится к типу, а не к экземпляру этого типа".

Python имеет декоратор @staticmethod, который при применении к члену класса делает метод доступным в классе, а не в экземплярах, и не передает методу автоматических аргументов.Декоратор @classmethod выполняет аналогичную функцию, но передает класс в качестве первого аргумента, что делает его гораздо более полезным.

В C static помечает функцию или глобальную переменную как локальную по отношению к файлу, в котором она находится.

Это что-то вроде private на других языках.Вроде того.

Если это в функции, то static предварительно выделяет эту переменную в разделе данных двоичного файла, а не в стеке во время выполнения.

В VB.NET static используется на уровне процедуры, чтобы означать, что переменная связана со всеми выполнениями процедуры (она сохраняется от вызова к вызову).Однако это немного непонятное использование в объектно-ориентированном приложении.

Аналог является "Общим", что означает, что метод или элемент имеет уровень типа (вам не нужен экземпляр для доступа к нему).

Википедия обобщает множество различных значений static:

Статические Методы, статические переменные, статическая типизация.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top