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

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

Войти
Регистрация
Восстановить пароль
 
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
#1

Нужен const или нет - C++

20.01.2013, 14:39. Просмотров 302. Ответов 6
Метки нет (Все метки)

Привет.
Перегружал оператор= для своего класса.

C++
1
2
3
4
5
Identificator& Identificator::operator=(const Identificator &_r_oper) {
    Length = _r_oper.getlen();
    Data = new char[Length+1];
    strcpy(Data, _r_oper.Get());    
}
Программа возмутилась на строках 2 и 3. Не понравилось ей то, что методы Get и getlen были не const (на stackoverflow решение посоветовали такое). Я из изменил:
C++
1
2
3
4
5
6
int String::getlen(void) const {
    return Length;  
}
char* Identificator::Get(void) const {
    return Data;    
}
не пугайтесь, функция getlen просто унаследована .

и все заработало.
боюсь, что решение топорное. скажите правильно ли я поступил изменив методы на const? надо ли было это сделать сразу же при их создании? могут ли быть какие-то последствия (если например программа не в 20 строк, как у меня, а в 20 000)?

Дело в том, что недавно прочитал статью, там было сказано пихайте const везде, где только можно, если объект не должен изменяться. Вот и пихаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 14:39     Нужен const или нет
Посмотрите здесь:

Зачем нужен const при перегрузке оператора C++
Ошибка с массивами, хотя формально её нет (похожи ли массивы или нет?) C++
C++ Enum или const?
C++ const& и const* в имени функции
C++ Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет
Нужен ли const? C++
C++ Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,903
Записей в блоге: 17
20.01.2013, 14:45     Нужен const или нет #2
Цитата Сообщение от VladSharikov Посмотреть сообщение
боюсь, что решение топорное. скажите правильно ли я поступил изменив методы на const?
Правильно...
Цитата Сообщение от VladSharikov Посмотреть сообщение
надо ли было это сделать сразу же при их создании?
Да ...
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 14:46  [ТС]     Нужен const или нет #3
Avazart, ой вы такие многозначительные многоточия поставили, будто я дибил после такой ошибки
я же только учусь

спасибо!
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1240 / 989 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.01.2013, 14:47     Нужен const или нет #4
Всё правильно сделал. Только return *this; ещё в присваивание же надо.

Последствия будут у тех, кто непоследователен. Или кому-то придётся дописывать const (что идеологически вернее), или кому-то костылить и убирать const.
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
20.01.2013, 14:47     Нужен const или нет #5
Решение правильное, но Identificator тоже должен возвращать не char*, а const char* (мы же не хотим, чтобы идентификатор случайно изменили?).
Последствия могут быть в виде того, что придётся напихать ещё много const-ов в разные другие места по всему коду, что может оказаться трудоёмко, но нужно. Так что да, const надо писать сразу при создании и рассматривать это как нечто "по умолчанию" - то есть, должны быть сформулированы чёткие причины для того, чтобы const не писать.
В статье было сказано правильно, пихать надо. В переменные, параметры функций, делать константные методы - везде, где смысл действия не предусматривает изменения в явном виде.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 14:49  [ТС]     Нужен const или нет #6
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Только return *this; ещё в присваивание же надо
точно! забыл, спасибо!

Добавлено через 1 минуту
Nick Alte,
имете в виду метод Get идентификатора или перегрузку оператора =?

Get и так теперь не изменишь (он же конст, сам метод), а оператор - дак почему бы и нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 15:06     Нужен const или нет
Еще ссылки по теме:

C++ Const - обещание (гарантия) или требование?
Int* const или const int*? C++
C++ Изменяется ли адрес или значение переменной при объявлении ее как const?
OpenCV C++ vs2010 error C2446: :: нет преобразования "const char *" в "_TCHAR *" C++
C++ Модификатор const для параметра функции не const?

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
20.01.2013, 15:06     Нужен const или нет #7
Очепятался, конечно, имелся в виду метод Get. То, что метод Get объявлен как const, означает только то, что он сам не может изменять данные в объекте. Однако если Data - не объявленный внутри объекта массив, а указатель, то и политика "неизменения" относится только к самому указателю, а не к тому, на что он указывает (собственно имени). В таком случае можно не изменяя формально сам объект Identificator испохабить связанные с ним данные. Защитой от этого и послужит const на возвращаемом типе. Если Data всё же массив внутри объекта, то возникнет ошибка компиляции: его нельзя будет преобразовать к char* из const-метода, только к const char*.
Yandex
Объявления
20.01.2013, 15:06     Нужен const или нет
Ответ Создать тему
Опции темы

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