Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 132, средняя оценка - 4.69
Nikolas9
0 / 0 / 0
Регистрация: 29.12.2011
Сообщений: 7
#1

Статическая переменная - C++

27.06.2012, 15:56. Просмотров 17124. Ответов 8
Метки нет (Все метки)

Добрый день!
Объясните пожалуйста, что такое статическая переменная, в каких случаях лучше использовать именно её и чем она вообще хороша?
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2012, 15:56     Статическая переменная
Посмотрите здесь:

C++ Статическая локальная переменная
Статическая переменная в шаблоне C++
Статическая линковка C++
C++ Статическая линковка
C++ Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз
C++ Статическая переменная возвращает непонятные шестизначные числа
Статическая переменная в классе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
27.06.2012, 16:10     Статическая переменная #2
Используется в классах. Если ты в классе объявешь переменную, то она будет своя у каждого объекта. А если ты объявешь статическую переменную, то она будет общей для всех объектов. Т.е. например ее можно будет использовать как счетчик.
DiffEreD
 Аватар для DiffEreD
1425 / 762 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
27.06.2012, 16:11     Статическая переменная #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Статические переменные объявляются директивой static. Они инициализируются только один раз - при первом вызове функции и сохраняют свое значение даже после выхода из функции. В следующий раз при новом вызове функции статические переменные будут иметь то же значение, которое они имели перед выходом из функции в послений раз.

Статические переменные объявляются в пределах описания функции и поэтому доступны для использования только в пределах той функции, в которой они объявлены.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
27.06.2012, 16:11     Статическая переменная #4
Еще бывают глобальные статические переменные и локальные статические переменные внутри функции. Все 3 варианта разные.
David Sylva
 Аватар для David Sylva
1283 / 945 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
27.06.2012, 16:13     Статическая переменная #5
Переменные типа static - это переменные так называемого долговременного хранения то есть она хранит свои значения в пределах своей функции или файла.

Статические переменные бывают локальные и глобальные.

Статические локальные переменные используются в тех случаях, когда необходимо сохранить значение переменной в памяти после того как выполнение функции будет завершено, то есть между вызовами функции.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
27.06.2012, 16:15     Статическая переменная #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int n = 200; // глобальная статическая переменная, она будет разная во всех модулях.
 
class Class
{
public:
   static int m_stat; // статическая переменная класса, общая для всех объектов класса
   int getRef()
   {
       static int ref = 0; //статическая переменная функции, сохраняет свое значение.
       return ref++;
   }
}
 
int Class::m_stat; // статические переменные класса обязательно определять
Nikolas9
0 / 0 / 0
Регистрация: 29.12.2011
Сообщений: 7
27.06.2012, 16:40  [ТС]     Статическая переменная #7
gooseim, а в этом примере кода она какая?для функции data:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
QVariant MyModel_2::data(const QModelIndex &index, int role) const
{
   static int i = -1;
   static int j = 0;
   static int fl = 0;
   if (!index.isValid() || !Parent->records->count()) return QVariant();
   if (role==Qt::DisplayRole || role==Qt::EditRole)
   {
       if(fl == 0)
       {
           i++;
           if(i > Parent->records->size()-2)
           {
 
               i = 0;
               j++;
               if(j > Parent->records->at(0).size()-1)
               {
                    j = 0;
                    fl = 1;
               }
           }
       }
       else
       {
           j++;
           if(j > Parent->records->at(0).size()-3)
           {
               j = 0;
               i++;
               if(i > Parent->records->size()-2)
               {
                    i = 0;
               }
           }
       };
       QStringList record = Parent->records->at(Parent->mass[i]);
       return record.at(index.column());
   }
   return QVariant();
}
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.06.2012, 16:47     Статическая переменная #8
Цитата Сообщение от Nikolas9 Посмотреть сообщение
а в этом примере кода она какая?для функции data
статическая переменная функции - сохраняет свое значение после выхода из функции
C++
1
2
3
4
5
6
7
8
9
10
11
void foo()
{
    static int i = 0;
    std::cout << i++ << '\n';
}
 
int  main()
{
    for (int i = 0; i < 4; ++i)
       foo();
}
output:
0
1
2
3
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 16:55     Статическая переменная
Еще ссылки по теме:

C++ Статическая библиотека
C++ Статическая переменная в методе класса
Переменная или переменная и условие C++
C++ Статическая библиотека
Статическая память C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
27.06.2012, 16:55     Статическая переменная #9
Nikolas9, такая же как у меня в getRef
Yandex
Объявления
27.06.2012, 16:55     Статическая переменная
Ответ Создать тему
Опции темы

Текущее время: 06:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru