статика на разных языках - PullRequest
4 голосов
/ 06 марта 2009

Я слышал, что между языками есть различия в значении ключевого слова static, но я не нашел хорошего списка, который объединяет эти различия.

Вот что я знаю о значении static в C ++:

  • Для локальных статических переменных внутри функции переменная инициализируется при запуске, и значение сохраняется во всех вызовах функций.
  • Статические члены-данные являются общими для всех экземпляров класса. Другими словами, существует только один экземпляр статического члена данных. Элементы статических данных должны быть инициализированы в области видимости файла.
  • Статические функции-члены имеют доступ только к статическим элементам.
  • В рекурсивном коде статический объект или переменная гарантированно имеют одинаковое состояние в разных экземплярах блока кода.
  • Статические объекты и переменные, определенные в области действия файла, имеют только внутреннюю связь. Другие файлы не могут их использовать.

Как меняется значение static на других языках?

Ответы [ 9 ]

10 голосов
/ 06 марта 2009

C


  • Ключевое слово может изменить либо связь, либо продолжительность (время жизни) объекта.
  • Переменные всегда инициализируются в 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 и далее)
  • В единице перевода может быть только одно определение статики
  • Переменные / функции-члены означают, что они являются свойствами класса, а не экземплярами Синтаксис легального доступа: instance.property или Class :: property
  • Статические функции-члены могут получать доступ только к статическим переменным-членам. Нет this указатель на такие функции
  • Нестатические члены могут, однако, иметь доступ к любому статическому члену
  • На уровне файлов объекты имеют внутреннюю связь, за исключением членов класса, имеющих область видимости
  • Члены класса должны быть определены либо в объявлении класса, либо вне его явно через оператор имени класса и разрешения области действия
  • Невозможно использовать this в статическом методе

ActionScript


  • Методы класса как в C ++
  • не может использовать this или super в статическом методе
  • Доступ только через имя класса, а не имя экземпляра
  • Не наследуется
  • Производные классы, однако, имеют доступ к статическим свойствам баз
  • Переменные, которые объявлены с ключевыми словами static и const, должны быть инициализированы одновременно с объявлением константы

Объектно-ориентированный дизайн


  • Шаблон проектирования Singleton рассматривается многими как прославленный статический объект
  • Используется в шаблоне проектирования фабрики

Возможно, я пропустил много других вещей - не стесняйтесь скинуться.

5 голосов
/ 06 марта 2009

В Delphi ключевое слово static используется исключительно для определения методов класса. В Delphi метод класса normal может быть объявлен виртуальным и переопределен в подклассе. Кроме того, Delphi имеет переменную self , аналогичную указателю this в других языках. Однако в методе класса self указывает на класс, в котором метод вызывается вместо экземпляра.

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

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

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

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

2 голосов
/ 06 марта 2009

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

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

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

2 голосов
/ 06 марта 2009

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

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

1 голос
/ 06 марта 2009

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

Аналог «Shared», что означает, что метод или член имеют уровень типа (вам не нужен экземпляр для доступа к нему).

1 голос
/ 06 марта 2009

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

Это похоже на личное на других языках. Сорта.

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

1 голос
/ 06 марта 2009

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

1 голос
/ 06 марта 2009

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

0 голосов
/ 06 марта 2009

В Википедии обобщено много разных значений static:

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

...