1) Статическая локальная переменная сохраняет свое значение между вызовами функции.
2) Статическая переменная (массив) сразу инициализируется нулем или нулями.
3) Область видимости статической локальной переменной как и у обычной а срок жизни - как у программы.
4) Статическая глобальная переменная имеет область видимости только тот файл где она объявлена. Соответственно не загрязняется глобальное пространство имен.
5) Статические объекты существуют все время работы программы, соответственно деструктор вызывается при завершении программы а не при выходе из области видимости
#include <iostream>
class Base { // строка 3
public:
Base() { // строка 5
std::cout << "Constructor" << std::endl;
}
~Base() { // строка 8
std::cout << "Destructor" << std::endl;
}
};
void foo() {
static Base obj; // строка 14
} // строка 15
int main() {
foo(); // строка 18
std::cout << "End of main()" << std::endl;
return 0;
}
/*Вывод программы:
Constructor
End of main()
Destructor
*/
Если убрать ключевое слово static из функции foo(), то деструктор будет вызываться при выходе из функции foo() и вывод программы изменится на:
Constructor
Destructor
End of main()
6) Статические члены класса существуют в единственном экземпляре для класса, будь то переменные или функции. Соответственно статическую переменную может читать и записывать любой объект класса и она является общей, а статические функции не содержатся в каждой реализации объекта и она является единственно для класса.