Изменения

Перейти к: навигация, поиск

Участник:Yulya3102/Плюсы2сем

3495 байт добавлено, 11:27, 12 февраля 2013
модификатор static
=== toolchain: препроцессор, транслятор, компоновщик ===
=== модификатор static ===
==== Local scope ====
//область видимости — блок
 
while (true)
{
static int i = 0;
i++;
}
 
Переменная '''i''' будет создана лишь один раз, и её значение будет храниться в течение всего времени выполнения программы, несмотря на выход за пределы области видимости. [http://ideone.com/cywkGv Тот же пример с выводом для наглядности.]
 
==== Function scope ====
//область видимости — функция
 
void foo()
{
static int i = 0;
i++;
}
 
Аналогично, переменная '''i''' сохраняется между вызовами '''foo()''', но видна только в пределах блока, в котором определена.
 
==== File scope ====
//область видимости — файл
 
static int global_static_local_to_this_file;
 
Очевидно, эта переменная будет видна повсюду в файле и только в нём.
 
==== Class scope ====
//область видимости — класс
 
''Статические данные'' можно получить так же, как и нестатические, с помощью операторов '''.''' и '''->'''. Но к ним также можно обращаться с помощью оператора '''::''', используя имя класса. Очевидно, создание объекта данного класса в данном случае не требуется.
 
Статические данные разделяются между всеми экземплярами класса.
 
Зачем это нужно? Например, так можно создать синглтон:
 
class singleton
{
private:
singleton(){}
public:
static singleton& instance()
{
static singleton inst;
return inst;
}
};
 
Объявление статической переменной внутри определения класса не является её определением. Если не инициализировать значение статической переменно, то по умолчанию будет присвоено значение 0. Внутри определения класса можно инициализировать переменные типов '''int''', '''char''', '''long''', '''bool''', а так же типов из пространства '''std'''.
 
Статические переменные не могут содержаться в локальных классах и не могут быть '''mutable'''.
 
''Статические методы'' не имеют указателя '''this''', поэтому в таких методах нельзя обращаться к нестатическим данным класса. К статическим методам можно обращаться через '''.''' и '''->''' по имени объекта и по имени класса через '''::'''.
 
Статические методы не могут быть виртуальными, не могут быть '''const''' и '''volatile'''. Локальные класса не могут содержать статические методы.
 
=== модификатор inline ===
=== one definition rule (ODR) ===
Анонимный участник

Навигация