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

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

Восстановить пароль Регистрация
 
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 14:39     Нужен const или нет #1
Привет.
Перегружал оператор= для своего класса.

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++
char operator[](unsigned short offset) const; // что означает const? C++
C++ Что это bool operator== (const CLASS&) const;
C++ Enum или const?
Нужен ли const? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,581
Записей в блоге: 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
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.01.2013, 14:47     Нужен const или нет #4
Всё правильно сделал. Только return *this; ещё в присваивание же надо.

Последствия будут у тех, кто непоследователен. Или кому-то придётся дописывать const (что идеологически вернее), или кому-то костылить и убирать const.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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++ int const * const foo(const int* param) const - разъясните значение квалификаторов
C++ Const - обещание (гарантия) или требование?
Int* const или const int*? C++

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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 или нет
Ответ Создать тему
Опции темы

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