В чём суть каждого из спецификаторов?
И почему в данном коде я не могу получить доступ к переменной 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;
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Начал недавно учиться программировать на c++ при выборе функции enter() во второй раз, моя программа выдаёт ошибку vector subscript out of range
В среде MVS2015 следующий код и вообще любой подобный: