Организация счётчика вызова функции
Получила задание (С++): "Продемонстрируйте работу со статическими переменными. Один из возможных вариантов - организация счетчика вызовов функции". Это одно из заданий по теме указатели, я не понимаю как связать это задание с темой, учитывая то, что передачу параметров по ссылке мы ещё не учили. Возможно ли как-то связать тему с кодом? Правильно ли я поняла задание? В задании сказано, что это "один из вариантов". Как ещё можно выполнить задачу?
void initialStaticVar()
{
static int s_var = 0;
s_var++;
cout << "Static Var = " << s_var << endl;
}
int main()
{
initialStaticVar();
initialStaticVar();
initialStaticVar();
return 0;
}
Ответы (3 шт):
Живут достаточное :) время глобальные переменные и статические переменные функции.
Отсюда и варианты.
Ваш:
int testFunc(...)
{
static int counter = 0;
counter++;
...
return counter;
}
С глобальной переменной:
[static] int counter = 0; // static - в зависимости от конкретного проекта
void testFunc(...)
{
counter++;
...
}
Или со статической переменной в другой функции:
int countFunc(bool check = false)
{
static int counter = 0;
if (!check) counter++;
return counter;
}
void testFunc(...)
{
countFunc();
...
}
int main()
{
...
cout << "testFunc was callsed " << countFunc(true) << " times\n";
...
}
Понятно, что конкретные функции могут изменяться в зависимости от ваших потребностей.
Если нужно просто добавить указатели к статическим переменным, можно сделать сделать так (предполагаю, что не учили передачу по ссылке, но учили передачу по указателю):
int* getCounter(){
static int c = 0;
return &c;
}
void incrementCounter(){
++(*getCounter());
}
void printCounter(){
std::cout << *getCounter();
}
void testFn(){
incrementCounter();
std::cout << "testFn\n";
}
UPD: Еще вариант (обычно плохой на практике, но в целом корректный):
static int* counterPtr;
void incrementCounter(){
++(*counterPtr);
}
int main(){
counterPtr = new int(0);
incrementCounter()
incrementCounter()
std::cout << *counterPtr;
delete counterPtr;
return 0;
}
Статические переменные создаются при старте программы и оканчивает свою жизнь при завершении.
Есть много понятий переменных с обозначением статические.
- Глобальная переменная без обозначения static.
- Глобальная переменная с обозначением static.
- Локальная переменная внутри функции.
- Глобальная переменная внутри пространства имён.
- Статическая переменная внутри объявления класса.
Глобальная переменная без обозначения static
header.h :
extern int i ;
main.cpp :
int i = 0 ;
function.cpp :
# include <header.h>
..
i = i + 1 ;
к переменной i можно будет обратиться если в её предварительно объявить как extern (может находиться в другом файле).
Глобальная переменная с обозначением static
function.cpp :
static int i = 1 ;
main.cpp :
static double i = 2.0 ;
Здесь обозначение static обязывает уменьшать область видимости переменной i только внутри .cpp файла. И в разных файлах эта переменная будет иметь разные значения или даже разные типы.
Локальная переменная внутри функции
int function1(int i){
static int sum = 0 ;
sum += i ;
return sum ;
}
double function2(double i){
static double sum = 0 ;
sum += i ;
return sum ;
}
Здесь переменных sum в программе две штуки. Но область видимости только в своей функции. Присваивание нулю этим переменным будет происходить только один раз при первом вызове функции. А если эти функции не будут бызваны вообще, то и эти переменные не будут инициилизированы никогда.
Эта переменная храниться не в стеке, а в глобальном пространстве и не теряет своё значение при выходе из функции.
Глобальная переменная внутри пространства имён
namespace NS {
int stat = 1 ;
}
namespace NS2 {
double stat = 2.0 ;
}
Здесь статические переменные имеют одинаковые имена, но имеют разные значения. К ним можно обращаться так : NS::stat , NS2::stat.
Статическая переменная внутри объявления класса
class C{
public :
static int sum ;
} ;
int C :: sum = 0 ;
Здесь переменная sum будет храниться в единственном экземпляре для всех членов класса C. И обращаться можно так-же, как если бы были объявлены в пространстве имён. Если политика разрешений класса позволяет.