Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.01.2013, 14:39. Просмотров 347. Ответов 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 везде, где только можно, если объект не должен изменяться. Вот и пихаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 14:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужен const или нет (C++):

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

Нужен ли const? - C++
Объясните пожалуйста, для чего в перегрузке операции сравнения пишется const? Ведь если убрать, все равно будет работать bool operator...

Зачем нужен const при перегрузке оператора - C++
Следующий код описывает класс СТРОКА string_. При перегрузке оператора '=' string_& string_::operator=(const string_ &str) ...

Что такое static const и для чего он нужен? - C++
Что такое static const ? И для чего он нужен ?

Enum или const? - C++
Что лучше использовать при объявлении целочисленных констант класса: enum или const?

Int* const или const int*? - C++
class A { public: A() : x(777) {} int* const GetX() { return &x; }

6
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,383
Записей в блоге: 17
20.01.2013, 14:45 #2
Цитата Сообщение от VladSharikov Посмотреть сообщение
боюсь, что решение топорное. скажите правильно ли я поступил изменив методы на const?
Правильно...
Цитата Сообщение от VladSharikov Посмотреть сообщение
надо ли было это сделать сразу же при их создании?
Да ...
1
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 14:46  [ТС] #3
Avazart, ой вы такие многозначительные многоточия поставили, будто я дибил после такой ошибки
я же только учусь

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

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

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

Get и так теперь не изменишь (он же конст, сам метод), а оператор - дак почему бы и нет.
0
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
20.01.2013, 15:06 #7
Очепятался, конечно, имелся в виду метод Get. То, что метод Get объявлен как const, означает только то, что он сам не может изменять данные в объекте. Однако если Data - не объявленный внутри объекта массив, а указатель, то и политика "неизменения" относится только к самому указателю, а не к тому, на что он указывает (собственно имени). В таком случае можно не изменяя формально сам объект Identificator испохабить связанные с ним данные. Защитой от этого и послужит const на возвращаемом типе. Если Data всё же массив внутри объекта, то возникнет ошибка компиляции: его нельзя будет преобразовать к char* из const-метода, только к const char*.
0
20.01.2013, 15:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 15:06
Привет! Вот еще темы с ответами:

Const - обещание (гарантия) или требование? - C++
Считал, что `const` в списке параметров функции - это всегда не требование, а гарантия - обещание не менять аргумент. Но вот столкнулся с...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения - C++
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start->next;} return c; } Функция...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.