2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
1 | ||||||
Изменение ссылки const объекта18.10.2015, 14:22. Показов 876. Ответов 19
Метки нет (Все метки)
Добрый вечер,
Как я вижу проблему - объект с пометкой const при вызове метода(позволяет вызвать только константные) не должен поменять свои данные (биты), кроме случая с mutable. Тут так и происходит - ничего не меняется. Переменная b попрежнему ссылается на переменную a. Но блин где логика?( Добавлено через 13 часов 58 минут
0
|
18.10.2015, 14:22 | |
Ответы с готовыми решениями:
19
int const * const foo(const int* param) const - разъясните значение квалификаторов Создание объекта в const методе Возвращение const ссылки на временный объект Const int& ссылки и константы в шаблонах |
Ушел с форума
|
||||||
18.10.2015, 14:31 | 3 | |||||
Эквивалентный пример с использованием указателей:
2
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
18.10.2015, 14:32 [ТС] | 4 |
Так как добиться защиты? или это лежит на программисте - если он пишит так - то должен понимать, что const объект схавает это.
0
|
18.10.2015, 14:37 | 5 |
Убежденный, привёл пример с указателем. Суть та же.
Добавлено через 3 минуты В данном случае можно объявить b ссылкой на константу: const int & b; .
2
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
18.10.2015, 14:50 [ТС] | 6 | |||||
Тогда не возможно будет вообще менять состояние на что ссылается с любым модификатором объекта.
А вот я придумал такой вариант:
Возможно это считать за ответ? Я могу менять как мне нужно объект и его поля, но если объект константый мне просто не даст вызвать "опасные" методы и соответствующий комментарий сопровождающему юзвергу.
1
|
18.10.2015, 14:53 | 7 |
Ну так тут у тебя 25-я строка работает только в купе с
const из 31-й.Честно говоря, я не встречал таких ситуаций, и мне кажется что это просто нужно предусмотреть, так сказать, "вручную".
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
18.10.2015, 14:55 [ТС] | 8 |
Так в этом и соль. Делаю с классом, что хочу - а в методы куда приходит (const Foo& obj) я знаю, что он выйдет оттуда таким же как и вошёл(как он так и его состовляющее)
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
18.10.2015, 15:00 [ТС] | 10 | |||||
0
|
rikimaru2013
|
18.10.2015, 15:05
[ТС]
#12
|
Не по теме: Всё я сдаюсь - я не смогу вам доказать что-то, так как вы не хотите воспринимать. Я пас.
0
|
18.10.2015, 15:16 | 13 |
Блин. Мне кажется что ты сам не совсем понимаешь ситуацию
Ок. Пользователь не сможет изменить константный объект, который ему каким-то образом предоставляется, но, допустим, внутри твоей библиотеки ты сам можешь изменять состояние объекта, так? Я правильно понял? Добавлено через 6 минут При если ты именно это имеешь в виду, то ты сможешь обезопасить только пользователя, но не себя, и удалённый метод тебе не поможет. В результате чего, мы возвращаемся к сообщению №4, а именно к вопросу "Так как добиться защиты?".
1
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
18.10.2015, 15:25 [ТС] | 14 |
Я рассматриваю вопрос - насколько я в безопасносте отдавая (const Foo& obj) - уверен ли я, что объект и его состовляющие не будут менятся внутри данной функции. Ответ: всё зависит от того: какие константные методы ты предоставишь в интерфейсе класса и будут ли они менять состовляющие.
Я понял мыслю, что castaway, вы несёте. Хочешь обезопасить себя? Пересмотри константный интерфейс на наличие "пробоин" в корабле и всё.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
18.10.2015, 16:18 | 16 | |||||
по той причине, что на языке с++ ссылки внезапно не обладают квалификатором const.
вот указатели бывают константами. и тогда, такой указатель нельзя перенацелить. для ссылок же это не имеет смысла, потому что они по своей природе своего рода константы.
экземпляр класса был рожден константным. следовательно все его данные члены так же получаются рождены как константы. а изменение состояние объекта, который был рожден как константа - есть UB. так что проблема существует. Добавлено через 4 минуты годное решение
1
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
18.10.2015, 16:52 [ТС] | 17 | |||||
я просто пришёл к новому выводу как писал, castaway, "зачем писать строку"
0
|
18.10.2015, 17:41 | 18 |
Честно говоря, в первом сообщении я заметил это только сейчас.
Так а в чём выгода? Если я закомментирую 25-ю строку в 10-м сообщении, то пример всё-равно не скомпилируется. Какой смысл менять шило на мыло?
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
18.10.2015, 22:28 | 19 |
вот я несколько раз говорил людям,
что все эти квалификаторы и модификаторы доступа нужны человекам, а не компилятору. все эти материи предназначены для гарантий инкапсуляции и инвариантов. почему мы нечто делаем приватным? потому что существует угроза: прямое вмешательство внешней стороны может повредить механизм. а так, сеттеры проконтролируют, что все правильно. аналогично и с квалификаторами: почему мы возвращаем константную ссылку? мы хотим сказать: пожалуйста, читайте. но гайки что б не подкручивали. подкручивание гаек может повредить механизм. теперь вернемся к нашим баранам: выгода в том, что намерения разработчика явным образом подчеркиваются. мы сообщаем читателю кода, что константной версии метода не должно быть. мы сделали это настолько явно, что читатель сразу же насторожиться: наверное это же не спроста? если вы просто закомментируете 25-ю строчку в 10-м сообщении, то тема вернется на исходную позицию (см сабж в первопосте): в будущем, программист не увидит предупреждающего явного запрета на константную версию метода, и может ничайно реализовать её, поимев ссылку, для которой не отработает защита квалификатора. компилятор не предупредит об опасности, и все - UB, приплыли.
0
|
19.10.2015, 00:18 | 20 |
hoggy, да я всё это прекрасно понимаю, и оставил не мало сообщений в этой теме со своими доводами и выводами, но если объект априори - константа, то какой смысл во всех этих манипуляциях!?
Наверное мы говорим немного о разном, и, возможно, преследуем немного разные цели...
0
|
19.10.2015, 00:18 | |
19.10.2015, 00:18 | |
Помогаю со студенческими работами здесь
20
Изменение const-переменной Как вызвать прегруженный const метод для статического объекта char operator[](unsigned short offset) const; // что означает const? Что это bool operator== (const CLASS&) const; Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |