Смысл static
От: Павел Кузнецов  
Дата: 28.08.02 08:44
Оценка: 66 (10) +1 -1
#Имя: FAQ.cpp.static
GR>Какой смысл несёт модификатор static для:
GR>1) переменных, объявленных внутри функции ???
GR>2) глобальных объектов ???

static -- "перегруженное" ключевое слово C++.

1) При объявлении члена класса (функции или переменной) ключевое слово static означает, что этот член класса является статическим. К статическим членам класса разрешен доступ вида: T::member. Статические фуннкции-члены класса не имеют неявного формального параметра this, не могут быть виртуальными или иметь модификатор const. Статические переменные не являются частью объектов данного класса, т.е. являются "общими" для всех объектов данного класса. Понятие статической переменной класса ближе всего к глобальным переменным C/C++ с точностью до правил доступа. В объектно ориентированной терминологии нестатические члены класса принято называть членами объекта (instance member), а статические — членами класса (class member).

  class Object {
    static void foo();
    static int i;
  };

  int Object::i = 0;

  void Object::foo() { }


Стандарт C++: 9.4 [class.static].
Страуструп. Язык программирования C++, 3-е издание: 10.2.4 [class.static].

2) При объявлении локальных переменных функции ключевое слово static означает, что переменная имеет статический класс памяти (static storage duration), т.е. существует в течение всего времени выполнения программы, в отличие от переменных с локальным классом памяти (automatic storage duration).

  void foo() {
    static int i = 0;
  }


Стандарт C++: 3.7.1 [basic.stc.static].
Страуструп. Язык программирования C++, 3-е издание: 7.1.2 [fct.static].

3) При объявлении переменных или функций на глобальном уровне (точнее, namespace scope), ключевое слово static означает, что переменная или функция имеет внутреннее связывание (internal linkage), т.е. к ним нет доступа из других единиц трансляции (translation units).

  static int i = 0;
  static void foo() { }


Стандарт C++: 3.5 [basic.link].
Страуструп. Язык программирования C++, 3-е издание: 9.2 [file.link].

Примечание: использование ключевого слова static в последнем значении не рекомендовано комитетом стандартизации C++ (is deprecated). Вместо этого рекомендуют использовать анонимные namespace (хотя, по более свежей информации, может быть, статус deprecated будет снят со static в этом значении для улучшения совместимости с C).

  namespace {
    int i = 0;
    void foo() { }
  }


Стандарт C++: D.2 [depr.static].
Страуструп. Язык программирования C++, 3-е издание: B.2.3.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: смысл static
От: ZakkeR Россия http://znav.narod.ru
Дата: 28.08.02 08:28
Оценка: 9 (1)
Здравствуйте GromRom, Вы писали:

GR>Какой смысл несёт модификатор static для:

GR>1) переменных, объявленных внутри функции ???
GR>2) глобальных объектов ???

GR>Заранее благодарен.


внутри функции: для переменной явно отводится память в области данных программы, т.е. после завершения функции содержимое переменной остается. Отличие от глобального объекта — область видимости ограничена данной функцией.

для глобальных объектов это ограничивает область их видимости данным модулем. Т.е. глобальная переменная с модификатором static не видна из других модулей, даже если писать extern имя;. Линкер просто ее не увидит.
кстати, к функциям это тоже относится. Так что если пожелаешь иметь в разных модулях функции с одинаковыми именами, то без static тебе не обойтись.
regards
Re: смысл static
От: Mink Россия  
Дата: 28.08.02 08:26
Оценка: -1
Здравствуйте GromRom, Вы писали:

GR>Какой смысл несёт модификатор static для:

GR>1) переменных, объявленных внутри функции ???

Значение переменной сохраняется между вызовами функции и пременная инициализируется по умолчанию.

GR>2) глобальных объектов ???


Память под объект выделяется при старте программы и освобождается при завершении и используется внутреннее связывание (internal linkage).

GR>Заранее благодарен.
Сила, она в ньютонах
смысл static
От: GromRom Россия  
Дата: 28.08.02 08:10
Оценка:
Какой смысл несёт модификатор static для:
1) переменных, объявленных внутри функции ???
2) глобальных объектов ???

Заранее благодарен.
Девиз настоящих студентов: Не боись — ПРОРВЁМСЯ
Re[2]: смысл static
От: Павел Кузнецов  
Дата: 28.08.02 08:49
Оценка:
Здравствуйте ZakkeR, Вы писали:

ZR>Так что если пожелаешь иметь в разных модулях функции с одинаковыми именами, то без static тебе не обойтись.


Это утверждение не является верным. Для решения этой проблемы в C++ введены анонимные namespace, являющиеся более общим способом. Например, static не позволяет ограничить "видимость" (с точки зрения компоновщика) имени класса одним модулем.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Смысл static
От: Lone Беларусь  
Дата: 18.08.04 19:41
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Примечание: использование ключевого слова static в последнем значении не рекомендовано комитетом стандартизации C++ (is deprecated). Вместо этого рекомендуют использовать анонимные namespace (хотя, по более свежей информации, может быть, статус deprecated будет снят со static в этом значении для улучшения совместимости с C).


А какие преимущества дает использование анонимных пространств имен вместо ключевого слова static в последнем значении? Просто всегда static использовал и даже не задумывался об этом.
"Жизнь проходит не так, как представлялось в детстве" © Остап Бендер
Re[2]: Смысл static
От: Шахтер Интернет  
Дата: 18.08.04 21:40
Оценка:
Здравствуйте, Lone, Вы писали:

L>Здравствуйте, Павел Кузнецов, Вы писали:


ПК>>Примечание: использование ключевого слова static в последнем значении не рекомендовано комитетом стандартизации C++ (is deprecated). Вместо этого рекомендуют использовать анонимные namespace (хотя, по более свежей информации, может быть, статус deprecated будет снят со static в этом значении для улучшения совместимости с C).


L>А какие преимущества дает использование анонимных пространств имен вместо ключевого слова static в последнем значении? Просто всегда static использовал и даже не задумывался об этом.


Например, можно сделать класс, видимый только в данной еденице трансляции. Со static ом такое сделать нельзя.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Смысл static
От: Павел Кузнецов  
Дата: 19.08.04 00:39
Оценка:
Шахтер:

> L>А какие преимущества дает использование анонимных пространств имен вместо ключевого слова static в последнем значении? Просто всегда static использовал и даже не задумывался об этом.


> Например, можно сделать класс, видимый только в данной еденице трансляции. Со static ом такое сделать нельзя.


Плюс, сущности, определенные в анонимном namespace, могут использоваться в качестве аргументов шаблонов. Со static такой номер не пройдет. http://rsdn.ru/Forum/Message.aspx?mid=118323&amp;only=1
Автор: Павел Кузнецов
Дата: 22.10.02
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Смысл static
От: Lone Беларусь  
Дата: 19.08.04 18:35
Оценка:
Буду знать. Спасибо.
"Жизнь проходит не так, как представлялось в детстве" © Остап Бендер
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.