В чём суть каждого из спецификаторов?
И почему в данном коде я не могу получить доступ к переменной i ,так как по определению static хранит значение до конца программы в памяти.
И еще как мне с помощью static посчитать сколько раз вызывалась функция?
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
int foo()
{
static int i = 0;
i++;
return i;
}
int main()
{
foo();
cout << i;
system("pause");
return 0;
}
В С++ уже давно нет спецификаторов хранения register и auto. Спецификаторы хранения в С++ сводятся к: static, thread_local, extern и mutable.
Прямой доступ к переменной в С++ делается через ее идентификатор - имя. Доступиться к переменной по ее "короткому" идентификатору можно только изнутри области видимости этого идентификатора. Также при помощи оператора :: можно доступаться к идентификаторам в других областях видимости. Однако оператор :: не позволяет доступаться к идентификаторам, объявленным локально. В вашем случае идентификатор i объявлен локально, т.е. виден только внутри функции foo, поэтому доступиться к i за пределами foo вы не сможете.
То, что "static хранит значение до конца программы" на видимость идентификатора i никак не вляет: время жизни объекта и область видимости его идентификатора - совершенно не зависящие друг от друга понятия.
"Как с помощью static посчитать сколько раз вызывалась функция" фактически прекрасно проиллюстрировано вашим же примером
int main()
{
cout << foo() << endl;
cout << foo() << endl;
cout << foo() << endl;
cout << foo() << endl;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей