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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модификатор const 
V
    Опции темы
hoz
Дата 26.4.2014, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

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



Читая учебник и попутно размышляя я столкнулся с модификатором const. И по нему у меня вопрос.

Если данный модификатор const используется с переменной то всё понятно. Переменной получено значение один раз, и больше значение данной переменной не изменится в будущем. Но хотя б один раз переменная получит значение. Так?

А как понять метод с модификтором const ?
Ведь в методе то может быть несколько переменных, да и вообще я не совсем понимаю как метод может не изменяться вообще. Есть у кого-нить примеры из практики употребления?
PM MAIL   Вверх
BlackSpace
Дата 26.4.2014, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 16.4.2014

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



hoz, а какую книгу по ООП C++ Вы читаете? 
PM MAIL   Вверх
feodorv
Дата 26.4.2014, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45





--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
hoz
Дата 26.4.2014, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

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



BlackSpace, Дейтела "Как программировать на С"
PM MAIL   Вверх
hoz
Дата 26.4.2014, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

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



feodorv, в примере по Вашей ссылке всё расписано очень доходчиво. Но как-бы сказать, у меня всё-таки есть некоторое недопонимание. Попробую объяснить.

Вот данный код:
Код

#include <iostream>
using namespace std;

class Test
{
public:
Test()
{
t = 0;
cnt = 0;
}
void setValue(int val)
{
t = val;       
}
int getValue() const
{      
cnt++;
return t;
}
void debug()
{
cout<<"cnt = "<<cnt<<endl;
}
private:
int t;
mutable int cnt;
};
void main()
{      
Test test;
test.setValue(99);
cout<<test.getValue()<<endl;
test.debug();
}

Данный метод int getValue() const так и так возвращает значение t. Иначе и быть не может. К чему тут модификатор const? Там, в любом случает, нет вероятности изменения переменной t, т.к. метод int getValue() const только возвращает значение t, и, ничего с ней не делает вообще...

Если не вникать в детали и тупо читать, то всё то понятно. Но вот если включить логику, то не совсем понятно. Хочется всё-таки уяснить причину использования данных модификаторов...

Это сообщение отредактировал(а) hoz - 26.4.2014, 12:23
PM MAIL   Вверх
vinter
Дата 26.4.2014, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(hoz @  26.4.2014,  12:36 Найти цитируемый пост)
Если не вникать в детали и тупо читать, то всё то понятно. Но вот если включить логику, то не совсем понятно. Хочется всё-таки уяснить причину использования данных модификаторов...

ты не можешь использовать неконстантные методы для константных объектов.


--------------------
Мой блог
PM MAIL WWW   Вверх
hoz
Дата 26.4.2014, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

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



Цитата(vinter @  26.4.2014,  12:26 Найти цитируемый пост)
ты не можешь использовать неконстантные методы для константных объектов. 

Например?
В выше приведённом примере объект test создан, и он не константный. Через него вызывается как константный метод getValue() const, так и не константный объект void debug().

Это сообщение отредактировал(а) hoz - 26.4.2014, 12:37
PM MAIL   Вверх
vinter
Дата 26.4.2014, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(hoz @  26.4.2014,  13:34 Найти цитируемый пост)
Например?

Код

void printValue(const Test& test)
{
    std::cout << test.getValue();
}



--------------------
Мой блог
PM MAIL WWW   Вверх
hoz
Дата 26.4.2014, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

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



 Тут понятно. Тогда в предыдущем примере, что я привёл выходит, т.к. нет там константного объекта модификатор const был не уместен? Или они на всякий случай так сделали?
PM MAIL   Вверх
vinter
Дата 26.4.2014, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(hoz @  26.4.2014,  13:55 Найти цитируемый пост)
Тогда в предыдущем примере, что я привёл выходит, т.к. нет там константного объекта модификатор const был не уместен? Или они на всякий случай так сделали?

программист пишет код не для примеров, а для работы. Любой класс должен выдавать ровно столько, сколько нужно и работать в максимально широкой сфере. Поэтому есть золотое правило - все методы должны быть константными, за исключением тех, которые не могут быть ими. Это упрощает понимание кода и упрощает его использование как в обычных ситуациях, так и в многопоточной среде(что уже стало обычной ситуацией). 




--------------------
Мой блог
PM MAIL WWW   Вверх
hoz
Дата 26.4.2014, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

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



Цитата(vinter @  26.4.2014,  13:21 Найти цитируемый пост)
Поэтому есть золотое правило - все методы должны быть константными, за исключением тех, которые не могут быть ими.

Я сколько встречал примеров константных методов, так попадаются только get-функции. Других не попадалось. Я вот пытаюсь представить какие ещё могут быть примеры употребления модификатора const, но кроме как возвратить некое значение (чаще полученное через get-функцию) ничего на ум не приходит.
Какие ещё бывают варианты употребления модификатора const?
PM MAIL   Вверх
vinter
Дата 26.4.2014, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



operator+,* и т.д. К примеру. 


--------------------
Мой блог
PM MAIL WWW   Вверх
hoz
Дата 26.4.2014, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

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



Цитата(vinter @  26.4.2014,  13:51 Найти цитируемый пост)
operator+,* и т.д. К примеру.  

И, опять же, это функция get. Которая больше никаких операций не выполняет...
PM MAIL   Вверх
vinter
Дата 26.4.2014, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



hoz, если что-то не модифицирует внутреннего состояния, то какого поведения ты ожидаешь? Конечно в конечном итоге это всё сводиться к get


--------------------
Мой блог
PM MAIL WWW   Вверх
hoz
Дата 26.4.2014, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

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



Цитата(vinter @  26.4.2014,  14:40 Найти цитируемый пост)
hoz, если что-то не модифицирует внутреннего состояния, то какого поведения ты ожидаешь?

vinter, ну я встречал применение данного модификатора для функций print, например. Хотя опять же, подобные операторы лишь выводят на экран (или на какой-нить ещё интерфейс) информацию и всё. Лично мне как-то сложновато понимается тот факт, что функции по факту нечего не изменяют, но тут ещё нужно модификатор поставить, что мол данная функция не изменяет ничего... В том время как и так понятно что они ничего не могут изменить.

Цитата(vinter @  26.4.2014,  14:40 Найти цитируемый пост)
Конечно в конечном итоге это всё сводиться к get 

У Дейтела ещё и принты тоже константные:
Код

printUniversal() const
{
   cout << setfill( '0' ) <<setw( 2 ) << hour << " : " << setw( 2 ) << minite << " : " << setw( 2 ) << second;
}

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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