Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2010, 01:47   #1
Kasper1
Форумчанин
 
Аватар для Kasper1
 
Регистрация: 13.12.2010
Сообщений: 220
По умолчанию Зачем нужен static

Объясните зачем нужно объявлять перменные за типом статик, что это даёт я так и не понял. Почему объявлять нужно в классе, а потом ещё и за классом?

Код:
class sova{
public: 
	static int a;
};

int sova::a; //Это выделение статической памяти для переменной а не объекта?

int main()
{
	sova::a = 5;
cin.get();
}
Kasper1 вне форума Ответить с цитированием
Старый 20.12.2010, 02:17   #2
Kasper1
Форумчанин
 
Аватар для Kasper1
 
Регистрация: 13.12.2010
Сообщений: 220
По умолчанию

Код:
class sova{
public: 
	static int a;
};

int sova::a;

int main()
{
	sova::a = 2;
	cout<<sova::a<<' ';
    sova::a = 10;
	cout<<sova::a;
.......
ВЫводит:  2      10
Скажите:
1) Получается я не создаю никакого объекта, а просто обращаюсь к переменной класса и даже не к свойству класса, а к переменной?
2)Мне не нужно создавать несколько объектов, а только через область видимости обращаться к переменной класса, но не к объекту?
3)Является ли оправданным объявление функций или переменных внутри класса за типом статик ведь если объявить статик за типом инт он будет занимать 4 байта который содержит инт на всё время запуска программы, объём программы этим увеличивается?

Последний раз редактировалось Kasper1; 20.12.2010 в 02:21.
Kasper1 вне форума Ответить с цитированием
Старый 20.12.2010, 02:51   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

статическая переменная класса это переменная общая для всех экземпляров этого класса.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.12.2010, 15:55   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Ну и еще маленький примерчик static.

Код:
for (int i = 0; i < n; i++)
{ 
 static int x = 0; x++; /* В таком случае это что-то типа запоминающего устройства, 
то есть при каждом проходе цикла, x не будет инициализироваться значением 0, а дальше спокойно будет увеличивать переменную */
}

Последний раз редактировалось coNsept; 20.12.2010 в 16:03.
coNsept вне форума Ответить с цитированием
Старый 20.12.2010, 17:34   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

для сокрытия глобальной функции, определенной в единице трансляции. из других единиц доступ не получить. сохранилось из сей. но в плюсах чаще используется неименованное пространство имен

Код:
main.c

int main()
{
    printf("%d\n", foo());
    return 0;
}

foo.c

int foo()
{
    return 0;
}
gcc main.c foo.c
все ок. foo видна в main-e.

но

Код:
static int foo()
{
    return 0;
}
при компиляции еррор - не объявлена foo


тож самое и с переменными

Код:
main.c

int ole = 200;

int main()
{
    printf("%d\n", foo());
    return 0;
}

foo.c

int ole = 100;
int foo()
{
    return ole;
}
ошибка. ole определена дважды. но
Код:
static int ole = 100;
int foo()
{
    return ole;
}
и все норм
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 20.12.2010 в 17:51.
pproger вне форума Ответить с цитированием
Старый 21.12.2010, 01:53   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

static это не тип - это ключевое слово. В случае с переменными - членами класса оно нужно для того, чтобы память под переменную была выделена не в самом объекте а в постоянной памяти программы - полная аналогия глобальных переменных, единственное что обращатся в коде надо по другому к ним.

Зачем нужно? Та же глобальная переменная но логически (для программиста) привязанная к определенному классу. На самом деле та же самомя глобальная переменная.

Зачем 2 раза писать? 1ый раз ты ее объявляешь - второй раз определяешь. Память под переменную выделяется при определении.

1) Обращаешся к обыкновенной глобальной переменной которая замаскирована под переменную класса. То есть на 100 объектов твоего класса эта переменная существует только одна.
2) Да обращаешся через ИмяКласса::имяСтатическойПеременной , но можно и через имяОбъекта.имяСтатическойПеременной , для использования статических переменных созданные объекты необязательны
3) Является ли оправданным использование глобальных переменных?
Если ты беспокоишся по поводу того что даже при отсутсвии созданных объектов класса память все равно выделена для статических членов - это просто ерунда по сравнению с тем объемом памяти который есть у компутеров) Если ты хранишь статическую инт в 4 байта от этого ни тепло ни холодно. Когда хранишь массивчик в 20 Мб то разговор другой конечно, но можно сделать статический указатель на этот массивчик а память выделять только при создании первого объекта класса к примеру.
UltimaBeaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зачем нужен Unit? alex198555 Общие вопросы Delphi 3 20.08.2010 01:10
Perl, DBIx::Class. Зачем нужен bind ? ssdm Perl 0 06.08.2010 18:31
.NET, зачем он нужен? Qousio Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 80 18.12.2009 23:42
Зачем нужен finally? ds.Dante Общие вопросы .NET 9 15.09.2009 12:09
Зачем нужен void? Сергей089 Общие вопросы C/C++ 7 23.03.2009 17:08