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.
Автор: Павел Кузнецов    Оценить