2009-03-06 5 views
3

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

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

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

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

+0

Статические локали в C++ инициализируются при первом вызове, а не при запуске. – 2009-03-06 19:16:22

+0

@Iraimbilanja, можете ли вы дать мне ссылку на это? По-видимому, MSDN предлагает другое. –

+0

@Iraimbilanja: C & V 6.7 (см. Мое сообщение ниже для точной строки). – dirkgently

ответ

8

С


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

ActionScript


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

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


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

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

+0

Чиппинг через годы: C++-файловая область статического устаревания больше не существует. – stan423321

1

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

+0

Java такой же. – Powerlord

+0

@R Bemrose - хорошо почти. «статический импорт» не совсем то же самое; это, конечно, не «эквивалент типа» нестатического импорта, например. –

+0

Но методы расширения, которые всегда «связаны с экземпляром типа», могут быть объявлены только в статических классах ... нарушающие хорошее правило. – bzlm

1

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

2

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

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

1

В C, статические флаги функция или глобальные переменные как локальные в файл, он расположен в.

Это вроде как частная и на других языках. Сорта.

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

1

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

Этот экземпляр является «общим», что означает, что метод или элемент является типом уровня (вам не нужен экземпляр для доступа к нему).

4

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

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

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

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

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

1

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

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

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

+0

Не забывайте, что при определении класса это также означает, что класс может объявлять методы расширения.Кроме того, «можно вызывать без необходимости вводить в действие класс» - это очень неортодоксальный способ его описания. И на конструкторе, не важно, что вместо этого он становится «конструктором класса»? – bzlm

+0

Если у вас есть класс с 3 статическими элементами и один статический контрструктор, статический конструктор всегда вызывается перед выполнением статического члена при каждом вызове члена. Это отличается от класса contructor, потому что класс contructor вызывается только тогда, когда класс instanciated. –

 Смежные вопросы

  • Нет связанных вопросов^_^