Если сделать переменную статической когда её нужно сделать статической, то это правильно. Если сделать переменную статической когда её не нужно делать статической, то это не правильно. Вот как-то так... (с)
Попытаюсь внести некоторую ясность.
В C++ есть понятие объектов со свойственными им методами и атрибутами.
Так вот, static означает что это метод/атрибут класса, а не объекта, соответсвенно static member будет одним для всех instances данного класса. Прежде чем применять этот стиль, надо дать себе отчет, о том, для каких целей будет использоваться этот member. При использовании static внутри функции означает что эта переменная будет выделена не в стеке, а в поле памяти глобальных переменных ( забыл как точно называется ). Это означает что эта функция не может использоваться рекурсивно или из нескольких тридов, при условии что каждая функция эту переменную меняет, а не использует как флаг или что то подобное. В любом случае это зависит от варианта использование. Но мое мнение, такого подхода следует избегать, потому что, maintenance будет затруднено.
Попытаюсь внести некоторую ясность.
В C++ есть понятие объектов со свойственными им методами и атрибутами.
Так вот, static означает что это метод/атрибут класса, а не объекта, соответсвенно static member будет одним для всех instances данного класса. Прежде чем применять этот стиль, надо дать себе отчет, о том, для каких целей будет использоваться этот member. При использовании static внутри функции означает что эта переменная будет выделена не в стеке, а в поле памяти глобальных переменных ( забыл как точно называется ). Это означает что эта функция не может использоваться рекурсивно или из нескольких тридов, при условии что каждая функция эту переменную меняет, а не использует как флаг или что то подобное. В любом случае это зависит от варианта использование. Но мое мнение, такого подхода следует избегать, потому что, maintenance будет затруднено.
klalafuda, опять не ту траву куришь, мы о другом говорим. Но автору поста сие почитать очень будет полезно. Кстати поставлю пиво тому, кто в Symbian сможет применить singletones в апликухах.
> В C++ есть понятие объектов со свойственными им методами и атрибутами
В С++ нет таких понятий, там есть:
- data members
- member functions
И все это - CLASS MEMBERS
> Если эта переменная тебе нужна только в пределах данной функции, то
очень даже правильно - инкапсуляция.
забавная интерпретация. ладно, тогда получается, что для любой
int
foo(int a, int b)
{
int c = a + b;
return c / 10;
}
..c должна быть статической? она ведь "нужна только в пределах данной функции" foo, right?
// wbr
Несовсем...
Человеку внутри функции понадобилась static переменная, но он
сомневался в том что объявление ее внутри функции корректно, на самом
деле это ни так, почему читай мой пост выше.
> Человеку внутри функции понадобилась static переменная, но он
сомневался в том что объявление ее внутри функции корректно
ну, если быть точным, в оригинале было
> знатоки с++, скажите пожалуйста, насколько правильно использовать в ф-циях статические переменные, например static int a=0;
i.e. "правильно". что само по себе вещь весьма субъективная и зависит от каждого конкретного случая. допустим, в приведенном мною примере это явно не так :)
ps: я не исходил из предположения, что автор сомневается в самой возможности объявления переменной как статической (это предпологается очевидным).
> на самом деле это ни так, почему читай мой пост выше.
ну с тем, что внутри функции можно объявить переменную как static никто и не спорит.
Вообще говоря вам тут все замечательно пояснили...
Один небольшой комментарий: если есть хоть малейшее подазрение на то, что метод/функция будет использована в многопоточной прикладе -- никаких статических переменных (в ней).
> Не факт, такую переменную ( объект ) всегда можно защетить
а не проще не делать ее статической ?
Не слишком большой расход ресурсов на такую простецкую вещь?
Варианты защиты:
1) Mutex - ресурсы системы ( ограниченное число )
2) Флаг - странновато
3) Асинхронная обработка (очередь)- те функция является хэндлером - трудоемко
типичный пример функции inet_XXX - подавляющее большинство not multi-thread safe, вот и мучаются люди.
> а не проще не делать ее статической ?
Все зависит от конкретной ситуации
Но я вынужден согласится что определение статических переменных
внутри функции, в многопоточной среде - это зло и лишние накладные
расходы.
пример применения static:
void Editor::newFile()
{
static int documentNumber = 1;
curFile = tr("document%1.txt").arg(documentNumber);
setCaption(curFile);
isUntitled = true;
++documentNumber;
}
Функция newFile() генерирует новое имя документа, например document2.txt. Поскольку переменная documentNumber объявлена как статическая, то она существует в единственном экземпляре, для всех объектов класса Editor.