Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> const & static 
:(
    Опции темы
Romikgy
Дата 6.9.2005, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Доброе время суток форумчанеsmile !!!

Чет я сидел разбирался с С++ и никак не пойму , к чему было придуманно и где использутся сабж в функциях классов, зачем их юзать то???
Ответьте плз, разъясните, или на ссылку пошлите, где такое по-нормальному написано, в двух книгах читал , так и не дошло smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 6.9.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



const -- просто информирует о том, что метод не изменяет значение членов
static -- метод имеет доступ к данным, объявленным как static
( это если на пальцах... )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Romikgy
Дата 6.9.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



А если не только на пальцах...
ЗЫ Спасибо


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 6.9.2005, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



а если не на пальцах -- тогда глянь в help' e... ( в билдеровском об этом пишут -- должны и в сткдийном написать )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Romikgy
Дата 6.9.2005, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Хм... Посмотрю... только на данный момент билдера нет под рукой smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 6.9.2005, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



тогда вот:
Цитата
C++ extends const to include classes and member functions. In a C++ class definition, use the const modifier following a member function declaration. The member function is prevented from modifying any data in the class.

A class object defined with the const keyword attempts to use only member functions that are also defined with const. If you call a member function that is not defined as const, the compiler issues a warning that a non-const function is being called for a const object. Using the const keyword in this manner is a safety feature of C++.


и
Цитата
Use the static storage class specifier with a local variable to preserve the last value between successive calls to that function. A static variable acts like a local variable but has the lifetime of an external variable.

In a class, data and member functions can be declared static. Only one copy of the static data exists for all objects of the class.

A static member function of a global class has external linkage. A member of a local class has no linkage. A static member function is associated only with the class in which it is declared. Therefore, such member functions cannot be virtual.

Static member functions can only call other static member functions and only have access to static data. Such member functions do not have a this pointer.



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Romikgy
Дата 6.9.2005, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Где то можно скачать эти тексты отдельно от билдера или др.?
Цитата(_hunter @ 6.9.2005, 11:41)
The member function is prevented from modifying any data in the class.

Как енто понять?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Artiom
Дата 6.9.2005, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Цитата(Romikgy @ 6.9.2005, 10:51)
Цитата (_hunter @ 6.9.2005, 11:41)
The member function is prevented from modifying any data in the class.

Как енто понять?

Это значит что метод, объявленный как константный не может изменять поля класса.


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Romikgy
Дата 6.9.2005, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Пнятно сиба. А первое где взять описание С++ или стандарт если есть таковой, полный?
Добавлено @ 11:59
И еще где сабж как правило юзают?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
_hunter
Дата 6.9.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



это вырезка не из стандарта, а из хелпа...
стандарт можно взять тут:
http://www.osrc.info/request.php?57

сабж юзают в team-разработке ( да и для себя полезно будет )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Romikgy
Дата 6.9.2005, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Тобишь когда толпа один проект делает? за ссылку сяпа ща полезем smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sergejzr
Дата 6.9.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



По идее static и const позвляют более или менее отслеживать состояние переменных в процессе выполнения программы. Уже на уровне компилятора они позволяют убирать/вводить ограничения

static - переменная будет удалена только по окончанию программы


Код

char* test_wrong()
{
char test[50];
return test; //Мы возвращаем локальную переменную. То есть мусор
}


char* test_right()
{
static char test[50];
return test;//Это ОК, так как место под переменную тест теперь выделено статически. и будет разрушено только по окончанию программы.
}


int main()
{
printf("%s", test_wrong());//Так нельзя делать. По причинам описанным в функции test_wrong
printf("%s", test_right());//Так ОК. По причинам описанным в функции test_right.
}


const - переменную обьявленную так после инициализации нельзя будет изменить.
что так же означает, что ты не сможешь передать такую переменную в функцию, которая принимает не const. Таким образом ты точно можешь сказать, что после передачи переменной в разнообразные функции её значение не поменяется.

Код

class Object
{
public:
int id;
Object(){id=0;}
};

void change(Object o)
{
o.id=2;
}

void dont_change(const Object o)
{
o.id=2;//Такое компилятор уже не пропустит! Ведь object o задекларирован как const.
printf("%i",o.id);//А это пройдёт, потому что printf как раз принимает const
}

int main()
{
Object tst1(); //этот обьект нам пофиг. Поменяется ли он где нибудь или нет 
const Object tst2();//А вот тут мы хотим, чтобы после всех махинаций обьект остался нетронутым.

//Обе функции пройдут без проблем;
change(tst1);
dont_change(tst1);

change(tst2);//Здесь будет ругаться компилер, ведь функция change меняет поля, а обьект tst2 мы задекларировали как const
dont_change(tst2); //А это пройдёт. dont_change задекларирована правильно и компилер знает, что её значение не поменяется.


}


Итог:
static нужно применять как можно реже. В идеальном случае вообще не применять. Ведь это всё занятые участки памяти, которые в программе можно изменить откуда угодно. Один раз задекларированная подобным образом переменная может менять значения откуда угодно и будет очень тяжело проследить за ней.

А вот const идеально писать везде где только зн6ачение аргументов в функции не меняется. Таким образом постореная программа будет иметь намного меньше глюков от того, что обьект переданный в функцию вдруг может поменятся. Программист чувствует себя так же намного увереннее.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Romikgy
Дата 6.9.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Тобишь константная фуннкция

Цитата(sergej @ 6.9.2005, 13:29)
зн6ачение аргументов в функции не меняется


не меняет значения аргументов, т.е.
Код

void foo(int a, int b) const;

идентично с
Код

void foo( const int a, const int b);



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Дрон
Дата 6.9.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Romikgy
Нет.

В первом случае const значит, что метод не меняет полей класса, в котором он находится.


--------------------
Да. Именно так.
PM   Вверх
sergejzr
Дата 6.9.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(Romikgy @ 6.9.2005, 13:12)
void foo(int a, int b) const;

Так не бывает. const бывает только функция обьекта и говорит о том, что в этой функции его поля не будут изменены т.е

Код

class Object
{
public:
int id;
Object(){id=0;}
void const_func() const
{
id=3; //этго компилер сделать не даст!!!
}
void not_const_func()
{
id=3; 
}
};


int main()
{
Object tst1(); //этот обьект нам пофиг. Поменяется ли он где нибудь или нет 
const Object tst2();//А вот тут мы хотим, чтобы после всех махинаций обьект остался нетронутым.

//Оба пройдут без проблем;
tst1.not_const_func();
tst1.const_func();


tst2.not_const_func(); //Компилер не даст вызвать эту функцию с константным обьектом
tst2.const_func(); //А эту даст.
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Romikgy
Дата 6.9.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Дрон
А во втором что будет менять???
Добавлено @ 14:23
Цитата(sergej @ 6.9.2005, 14:20)
tst2.const_func(); //А эту даст.

А смысл в ней если компилятор не даст?????????


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sergejzr
Дата 6.9.2005, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(Romikgy @ 6.9.2005, 13:20)
А во втором что будет менять???

Ничего. Ведь это не функция класса. В теле этой функции будет однако возможно например распечатать переменные (ведь их не надо при этом изменять).

Цитата(Romikgy @ 6.9.2005, 13:20)
А смысл в ней если компилятор не даст?????????


Смысл, как и в других защитных механизмах (например private) в том, чтобы не дать выстрелить себе в ногу smile.

Например возьмём обьект

Супер_важный_контракт

Код

class Контракт
{
  char* подпись;
  char* имя;
  char * адрес;
 int сумма;
  
Контракт(имя, подпись, адрес, сумма)
void распечатать() const;
void положить_в_конверт() const;

void подписать(новая_подпись);//эта функция меняет поля и смысла делать её const нет.
void изменить_сумму(новая сумма);//эта функция меняет поля и смысла делать её const нет.
}  

int main()
{
Контракт обр;//обрабатываемый контракт
const Контракт Супер_важный_контракт(Вася, Я, Камчатка, 10000);//Теперь этот контракт больше никогда не изменить.
Супер_важный_контракт.изменить_сумму(0);//фигушки :) копмилер не даст
Супер_важный_контракт.распечатать();//пожалуйста :)
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Romikgy
Дата 6.9.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Интересно... общий смысл стал понятен,
только зачем такие сложности не пойму , ну да ладно smile
Еще раз благодарен всем ответившим smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sergejzr
Дата 6.9.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(Romikgy @ 6.9.2005, 13:51)
только зачем такие сложности не пойму

Просто если ты два месяца не видел свою программу, ты сам фиг разберёшься, где у тебя что меняется, а где нет.
Поэтому простое правило. Пиши как можно больше const. Везде, даже по умолчанию. Убирай их, только если не менять ну совсем нельзя.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Vyacheslav
Дата 7.9.2005, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(sergej @ 6.9.2005, 14:20)
Так не бывает. const бывает только функция обьекта и говорит о том, что в этой функции его поля не будут изменены т.е


Ну если уж быть совсем точным, то в констатном методе нельзя изменить только те поля класса, которые не имеют спецификатора mutable.
Код

class Alpha {
   mutable int count;
   mutable const int* iptr;
public:
   int func1(int i = 0) const { // Promises not to change const arguments.
      count = ++i;  // But count can be changed.
      iptr = &i;
      cout << *iptr << endl;
      return count;
      }
};





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.